2

我需要查找并替换指向超链接的 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 来解决我的问题。

4

1 回答 1

2

正则表达式很适合这个问题——所以更好用preg_replace

现在您的模式中只有几个未转义的定界符,因此请转义它们或选择另一个字符作为定界符 - 例如,^. 因此,正确的模式是:

$httpRegex = '^\b(?:(?:https?|ftp|file):\/\/|(www|ftp)\.)[-A-Z0-9+&@#\/%\?=~_|$!:,.;]*[-A-Z0-9+&@#\/%=~_|$]^i';
于 2012-10-18T02:01:00.717 回答