在preg_replace中转义正则表达式中的url

时间:2012-04-25 13:53:06

标签: php regex preg-replace urlencode

我正在尝试将某些标记重定向到另一个页面,并将其href作为url参数传递。我正在使用的代码是这样的:

preg_replace(
    "/<a(\s[^>]*)href=[\"\']??([^\" >]*?)[\"\']??([^>]*)>(.*)<\/a>/siU", 
    "<a$1href=\"".WWW."go.php?to=".urlencode("$2")."\"$3>$4</a>", $text
);

它是找到here的正则表达式的修改版本。我在这个块中使用了这段代码:

$text = "<...some other tags...><a target=\"_blank\" href=\"http://www.google.com\" style=\"...\" class=\"...\">Google</a></...some other tags...>";

它被正确捕获,但是当使用urlencode("$2")时,它会收到一个"$2"字符串,而不是存储在preg变量中的值(就像我一样)。它不仅限于urlencode,而是将其作为参数传递给任何其他函数。所以我不仅要编码这个(我总是可以扩展一点regexp来接受url)但通常在方法中使用变量。

你知道对此有任何解决方法吗?提前谢谢。

1 个答案:

答案 0 :(得分:3)

这是完全正常的,因为你的url编码字符串“$ 2”,然后urlencoded字符串用于替换,所以你最终得到与写

相同的东西
"<a$1href=\"".WWW."go.php?to=$2\"$3>$4</a>" 

作为第二个参数。如果你想要评估urlencode,你必须使用e(for eval)标志,如下所示:

preg_replace(
    "/<a(\s[^>]*)href=[\"\']??([^\" >]*?)[\"\']??([^>]*)>(.*)<\/a>/seiU", 
    "'<a$1href=\"'.WWW.'go.php?to=\"'.urlencode('$2').'\"$3>$4</a>'", $text
);

另一个更好的解决方案可能是使用preg_replace_callback来避免依赖于评估未知字符串

相关问题