我创建了这个正则表达式
(www|http://)[^ ]+
匹配每个 http:// ... 或 www .... 但我不知道如何制作可行的preg_replace,我试过< / p>
preg_replace('/((www|http://)[^ ]+)/', '<a href="\1">\1</a>', $str);
但它不起作用,结果是空字符串。
答案 0 :(得分:14)
您需要转义正则表达式中的斜杠,因为您使用斜杠作为分隔符。您还可以使用其他符号作为分隔符。
// escaped
preg_replace('/((www|http:\/\/)[^ ]+)/', '<a href="\1">\1</a>', $str);
// another delimiter, '@'
preg_replace('@((www|http://)[^ ]+)@', '<a href="\1">\1</a>', $str);
答案 1 :(得分:2)
使用其他用户提供的正则表达式代码时,请务必添加“i”标志以启用不区分大小写,因此它将同时适用于HTTP://和http://。例如,使用混沌代码:
preg_replace('!(www|http://[^ ]+)!i', '<a href="\1">\1</a>', $str);
答案 2 :(得分:2)
首先,你需要逃避 - 甚至更好,替换 - 在其他答案中解释的分界符。
preg_replace('~((www|http://)[^ ]+)~', '<a href="\1">\1</a>', $str);
其次,为了进一步改进正则表达式,$n
替换参考语法优先于\\n
,如manual中所述。
preg_replace('~((www|http://)[^ ]+)~', '<a href="$1">$1</a>', $str);
第三,你不必要地使用捕获括号,这只会减慢速度。摆脱它们。不要忘记将$1
更新为$0
。如果您想知道,这些是非捕获括号:(?: )
。
preg_replace('~(?:www|http://)[^ ]+~', '<a href="$0">$0</a>', $str);
最后,我会将[^ ]+
替换为更短且更准确的\S
,这与\s
相反。请注意[^ ]+
不允许空格,但接受换行符和标签! \S
没有。
preg_replace('~(?:www|http://)\S+~', '<a href="$0">$0</a>', $str);
答案 3 :(得分:1)
preg_replace('!((?:www|http://)[^ ]+)!', '<a href="\1">\1</a>', $str);
当您使用/
作为模式分隔符时,在模式中使用/
将无法正常工作。我使用!
作为模式分隔符解决了这个问题,但你可以用反斜杠转义斜杠。
我也没有看到你为什么要进行两次捕获的原因,所以我删除了其中一个。
在你的情况下遇到的部分麻烦就是你正在运行警告被抑制;如果您有error_reporting(E_ALL)
,那么您已经看到了PHP正在尝试生成有关正则表达式中分隔符问题的消息。
答案 4 :(得分:1)
你的主要问题似乎是你把所有东西放在括号中,所以它不知道“\ 1”是什么。此外,您需要转义“/”。所以试试这个:
preg_replace('/(www|http:\/\/[^ ]+)/', '<a href="\1">\1</a>', $str);
编辑:实际上括号似乎不是问题,我误解了它。逃跑仍然是一个问题,其他人也指出。两种解决方案都应该有效。
答案 5 :(得分:1)
如果字符串中包含多个url,则以换行符而不是空格分隔,则必须使用\ S
preg_replace('/((www|http:\/\/)\S+)/', '<a href="$1">$1</a>', $val);