我创建了这个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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top