如何用http替换http://或www

时间:2009-07-04 21:11:18

标签: php regex preg-replace

我创建了这个正则表达式

(www|http://)[^ ]+

匹配每个 http:// ... www .... 但我不知道如何制作可行的preg_replace,我试过< / p>

preg_replace('/((www|http://)[^ ]+)/', '<a href="\1">\1</a>', $str);

但它不起作用,结果是空字符串。

6 个答案:

答案 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);