PHP用BBCODE URL替换HREF链接

时间:2016-01-18 22:56:31

标签: php regex preg-replace

把头发拉出来。我正在解析文本,我需要将任何href链接转换为bbcode URL。例如:

<a href="http://www.foo.com" rel="nofollow">http://www.foo.com</a>

这是我的PHP代码:

$str = preg_replace('#(<a href=[\'"])(.*?)([\'"]>)(.*?)(</a>)#', '[URL=$2]$4[/URL]', $str);

无论我尝试做什么,我能得到的最好的是:

[URL=http://www.foo.com" rel="nofollow]http://www.foo.com[/URL]

我也试过这个:

$str = preg_replace('#(<a href=[\'"])(.*?)([\'"]>)([^\'"].*?)(</a>)#', '[URL=$2]$4[/URL]', $str);

没有任何作用。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

另一个通配符可以解决该正则表达式的问题 - 您需要在结束">之间允许额外的字符:

$str = preg_replace('#(<a href=[\'"])(.*?)([\'"].*>)(.*?)(</a>)#', '[URL=$2]$4[/URL]', $str);

根据您的数据,您可能还需要考虑其他可能的组合,例如链接看起来像<a rel="nofollow" href="http://www.foo.com">http://www.foo.com</a>

$str = preg_replace('#(<a\s.*href=[\'"])(.*?)([\'"].*>)(.*?)(</a>)#', '[URL=$2]$4[/URL]', $str);

答案 1 :(得分:-1)

DOMDocument的一个例子:

$html = '<div><a href="http://www.foo.com" rel="nofollow">http://www.foo.com</a></div>';
$dom = new DOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
$nodeList = $dom->getElementsByTagName("a");
$linkArr = [];
foreach ($nodeList as $link) { $linkArr[] = $link; }
foreach ($linkArr as $link) {
    $text = "[URL=" . $link->getAttribute("href") . "]"
          . $link->nodeValue . "[/URL]";
    $link->parentNode->replaceChild($dom->createTextNode($text), $link);
}
echo $dom->saveHTML();
相关问题