0

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

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

它是此处找到的正则表达式的修改版本。我在此块中使用此代码:

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

它正确地被捕获,但是在使用时urlencode("$2"),它收到一个"$2"字符串,而不是存储在 preg 变量中的值(就像我一样)。它不仅限于 urlencode,还可以将其作为参数传递给任何其他函数。所以我不仅想对此进行编码(我总是可以多扩展一点正则表达式以接受 url),而且通常在方法中使用变量。

你知道任何解决方法吗?提前致谢。

4

1 回答 1

3

这是完全正常的,因为您的 url 编码字符串“$2”,然后使用 urlencoded 字符串进行替换,因此您最终得到与写入相同的内容

"<a$1href=\"".WWW."go.php?to=$2\"$3>$4</a>" 

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

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

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

于 2012-04-25T14:04:48.100 回答