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


Escape a url within a regular expression in a preg_replace

我正在尝试将一些标签重定向到另一个页面,将其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),而且通常在方法中使用变量。

您知道对此有什么解决方法吗?提前谢谢。

这是

完全正常的,因为您的URL编码字符串"$2",然后使用urlencode字符串进行替换,因此您最终会得到与写入相同的内容

"<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 来避免依赖计算未知字符串