PHP 将 HREF link 替换为 BBCODE URL

PHP Replacing HREF link with BBCODE URL

为此我大发雷霆。我正在解析文本,我需要将任何 href 链接转换为 bbcode URL。示例:

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

这是我的 PHP 代码:

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

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

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

我也试过这个:

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

没有任何效果。任何帮助将不胜感激。

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

之间允许额外的字符
$str = preg_replace('#(<a href=[\'"])(.*?)([\'"].*>)(.*?)(</a>)#', '[URL=][/URL]', $str);

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

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

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();