如何取代http://或与www 在PHP
-
23-08-2019 - |
题
我创建了这个regex
(www|http://)[^ ]+
那匹配的每一个 http://... 或 www.... 但我不知道如何使preg_replace会的工作,我已经试过了
preg_replace('/((www|http://)[^ ]+)/', '<a href="\1">\1</a>', $str);
但是它不工作,结果是empty string.
解决方案
您需要逃避斜线的正则表达式,因为你正在使用斜线作为分隔符。你也可以使用其他符号作为分隔符。
// escaped
preg_replace('/((www|http:\/\/)[^ ]+)/', '<a href="\1">\1</a>', $str);
// another delimiter, '@'
preg_replace('@((www|http://)[^ ]+)@', '<a href="\1">\1</a>', $str);
其他提示
当使用由其他用户提供的正则表达式的代码,一定要加入“i”的标志,以使不区分大小写,所以它会与两个HTTP工作://和http://。例如,使用混乱的代码:
preg_replace('!(www|http://[^ ]+)!i', '<a href="\1">\1</a>', $str);
首先,你需要逃脱—或甚至更好,替换的定界符是否正如在其他的答案。
preg_replace('~((www|http://)[^ ]+)~', '<a href="\1">\1</a>', $str);
其次,进一步提高regex, $n
替换参照语法是首选 \\n
, 如在 手册.
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);
您的主要问题似乎是,你把一切都在括号中,因此它不知道什么是“\ 1”。此外,你需要躲避“/”。所以,试试这个:
preg_replace('/(www|http:\/\/[^ ]+)/', '<a href="\1">\1</a>', $str);
编辑:其实好像括号不是问题,我看错了。逃逸仍然是一个问题,因为其他人也指出。两种解决方案应该工作。
preg_replace('!((?:www|http://)[^ ]+)!', '<a href="\1">\1</a>', $str);
当您使用/
为您的模式定界符,有你的格局里面/
将无法正常工作搞好。我解决了这个用!
为图案分隔符,但你可以逃脱用反斜杠,而不是你的斜杠。
我还没有看到任何理由为什么你做两所括号捕捉,所以我删除其中的一个。
在您的情况麻烦的部分原因是,你与抑制警告运行;如果你已经error_reporting(E_ALL)
上,你会看到消息PHP尝试生成有关您正则表达式的分隔符的问题。
如果有包含在由换行,而不是一个空间分离的一个字符串的多个URL,则必须使用\ S
preg_replace('/((www|http:\/\/)\S+)/', '<a href="$1">$1</a>', $val);