把头发拉出来。我正在解析文本,我需要将任何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);
没有任何作用。任何帮助将不胜感激。
答案 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();