为什么这个PHP正则表达式给我错误?

时间:2009-08-14 08:34:50

标签: php regex

需要一些Regex的帮助:

我想替换

[url=http://youtube.com]YouTube.com[/url]

<a href="http://youtube.com">YouTube.com</a>

正则表达式

preg_replace("/[url=(.*?)](.*?)[/url]/is", '<a href="$1">$2</a>', $text);

为什么这会给我:

警告:preg_replace()[function.preg-replace]:第18行的C:\ Programa \ wamp \ www \ func.php中的未知修饰符'r'

5 个答案:

答案 0 :(得分:6)

您应该在正则表达式中转义特殊字符:

preg_replace('/\[url=(.*?)](.*?)\[\/url]/is', '<a href="$1">$2</a>', $text);

我已经转义了[个字符(它们指定了字符类的开头)和/字符(它指定了正则表达式的边界。)

或者(对于/字符),您可以使用另一个边界字符:

preg_replace('#\[url=(.*?)](.*?)\[/url]#is', '<a href="$1">$2</a>', $text);

但你仍然必须逃避[个字符。

答案 1 :(得分:1)

PHP正在将/中的“/url”解释为正则表达式的结尾和正则表达式选项的开头。在其前面插入“\”,使其成为文字“/”。

您需要以相同的方式转义'[(否则它们将被解释为引入一个字符类)。

preg_replace("/\[url=(.*?)](.*?)\[\/url]/is", '<a href="$1">$2</a>', $text);

答案 2 :(得分:0)

斜杠和方括号都是正则表达式中的特殊字符,您需要将它们转义:

\/ \[ \]

答案 3 :(得分:0)

正则表达式字符串中的第二个'/'结束正则表达式。你需要逃脱它。另外,preg_replace会将'[url =(。*?)]'解释为一个字符类,所以你也需要将它们转义。

preg_replace('/\[url=(.*?)\](.*?)\[\/url\]/is', '<a href="$1">$2</a>', $text);

答案 4 :(得分:0)

您似乎刚开始使用正则表达式。如果是这种情况 - 或者即使不是 - 你会发现the Regex Coach是一个非常有用的工具。它为我们提供了一个沙盒来测试我们的模式匹配和我们的替换字符串。如果你一直在使用它,它会突出显示需要转义特殊字符。