php regex替换substring

时间:2017-04-20 13:23:40

标签: php regex replace

我正在尝试使用php regex检测网址,并用&amp替换所有&。我在所有输入数据中都运行了htmlspecialchars,但我希望网址可读。我做了那些显然不起作用的,因为替换部分是错误的。

preg_replace('!(http(s)?://((\S)|(&amp))*)!m', '&', $message); 

基本上我希望所有的字符串保持不变但是当它在url中发生时更改& amp。我想使用preg_match_all但是如果数组的值没有通过引用传递它不会工作。

关于我如何做到的任何想法?

2 个答案:

答案 0 :(得分:0)

您可以将网址与相对简单的!https?://\S+!匹配(匹配http://https://,然后匹配1个非空白符号)并修改每个内部的&amp匹配使用preg_replace_callback

$message = preg_replace_callback('!https?://\S+!', function ($m) { 
    return str_replace('&amp', '&', $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('/&amp/i', '&', $match);
    $match = preg_quote($match);
    $html = preg_replace("@$match@", $fixed, $html);
}