PHP preg_replace与自定义网址的怪异

时间:2010-01-07 17:14:27

标签: php preg-replace

我正在使用以下代码在<span>代码后添加<a>代码。

$html = preg_replace("~<a.*?href=\"$url\".*?>.*?</a>~i", "$0<span>test</span>", $html);

代码适用于常规链接(即。http://www.google.com/),但当$ url的内容为$link$/3/时,它不会执行替换。

这是显示(错误)行为的示例代码:

<?php
    $urls = array();
    $urls[] = '$link$/3/';
    $urls[] = 'http://www.google.com/';

    $html = '<a href="$link/3/">Test Link</a>' . "\n" . '<a href="http://www.google.com/">Google</a>';

    foreach($urls as $url) {
        $html = preg_replace("~<a.*?href=\"$url\".*?>.*?</a>~i", "$0<span>test</span>", $html);
    }

    echo $html;
?>

这是它产生的输出:

<a href="$link$/3/">Test Link</a>
<a href="http://www.google.com/">Google</a><span>test</span>

4 个答案:

答案 0 :(得分:3)

$url = preg_quote($url, '~');美元符号被解释为通常的:输入结束。

答案 1 :(得分:2)

只是某人是正确的;如果你的意思是将它们解释为文字,你必须转义你的特殊正则表达式字符。

它也让我觉得它无法执行替换,因为它永远不会匹配。

尝试替换此行:

$urls[] = '$link$/3/';

有了这个:

$urls[] = '$link/3/';

答案 2 :(得分:1)

$被视为特殊的正则表达式字符,需要进行转义。在将$url传递给preg_replace()之前,请使用preg_quote()来转义$url = preg_quote($url, '~');

{{1}}

答案 3 :(得分:0)

$在正则表达式中有特殊含义。行结束。你的表达式正在扩展如下:

$html = preg_replace("~<a.*?href=\"$link$/3/\".*?>.*?</a>~i", "$0<span>test</span>", $html);

哪个失败,因为它找不到两行之间的“链接”。尝试转义$ urls数组中的$:

$urls[] = '\$link\$/3/';