我正在尝试将某些标记重定向到另一个页面,并将其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)但通常在方法中使用变量。
你知道对此有任何解决方法吗?提前谢谢。
答案 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来避免依赖于评估未知字符串