我正在尝试使用php regex检测网址,并用&
替换所有&
。我在所有输入数据中都运行了htmlspecialchars
,但我希望网址可读。我做了那些显然不起作用的,因为替换部分是错误的。
preg_replace('!(http(s)?://((\S)|(&))*)!m', '&', $message);
基本上我希望所有的字符串保持不变但是当它在url中发生时更改& amp。我想使用preg_match_all
但是如果数组的值没有通过引用传递它不会工作。
关于我如何做到的任何想法?
答案 0 :(得分:0)
您可以将网址与相对简单的!https?://\S+!
匹配(匹配http://
或https://
,然后匹配1个非空白符号)并修改每个内部的&
匹配使用preg_replace_callback
:
$message = preg_replace_callback('!https?://\S+!', function ($m) {
return str_replace('&', '&', $m[0]);
}, $message);
查看PHP demo。
答案 1 :(得分:0)
这可能对您有用:
preg_match_all('%https?://\S+%msi', $html, $matches, PREG_PATTERN_ORDER);
foreach ($matches[0] as $match)
{
$fixed = preg_replace('/&/i', '&', $match);
$match = preg_quote($match);
$html = preg_replace("@$match@", $fixed, $html);
}