我需要查找并替换指向超链接的 http 链接。这些 http 链接在 span 标签内。
$text 有 html 页面。其中一个跨度标签有类似的东西
<span class="styleonetwo" >http://www.cnn.com/live-event</span>
这是我的代码:
$doc = new DOMDocument();
$doc->loadHTML($text);
foreach($doc->getElementsByTagName('span') as $anchor) {
$link = $anchor->nodeValue;
if(substr($link, 0, 4) == "http")
{
$link = "<a href=\"$link\">$link</a>";
}
if(substr($link, 0, 3) == "www")
{
$link = "<a href=\"http://$link\">$link</a>";
}
$anchor->nodeValue = $link;
}
echo $doc->saveHTML();
它工作正常。但是......即使跨度内的数据类似于:
<span class="styleonetwo" > sometexthere http://www.cnn.com/live-event somemoretexthere</span>
显然上面的代码不适用于这种情况。有没有一种方法可以在不使用 preg_replace 的情况下使用 DOMDocument 搜索和替换模式?
更新:回答 phil 关于 preg_replace 的问题:
我使用 regexpal.com 来测试以下模式匹配:
\b(?:(?:https?|ftp|file)://|(www|ftp)\.)[-A-Z0-9+&@#/%?=~_|$!:,.;]*[-A-Z0-9+&@#/%=~_|$]
它在 regexpal 中提供的 regextester 中效果很好。当我在 PHP 代码中使用相同的模式时,我得到了大量奇怪的错误。即使是转义字符,我也遇到未知修饰符错误!以下是我的 preg_replace 代码
$httpRegex = '/\b(\?:(\?:https?|ftp|file):\/\/|(www|ftp)\.)[-A-Z0-9+&@#/%\?=~_|$!:,.;]*[-A-Z0-9+&@#/%=~_|$]/';
$cleanText = preg_replace($httpRegex, "<a href='$0'>$0</a>", $text);
我对“未知修饰符”感到非常沮丧,并寻求 DOMDocument 来解决我的问题。