2010-05-22 74 views
3

我有这样的正则表达式:PHP RegExpr错误未知的修饰词“(”

([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?) 

其从论坛中提取主题链接

现在,当我使用它在我的剧本

$url = "([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)"; 

preg_match_all spits:“未知修饰符”(''

这也是对preg_match的调用

preg_match_all($url, $str, $matches,PREG_OFFSET_CAPTURE,3); 

谁能帮我解决这个明显的愚蠢问题

+2

这是一个奇怪的正则表达式。它会匹配“nice.rum.is.nice.1234”,就像匹配该网址一样容易。你确定你想要使用角色类吗? – 2010-05-22 15:07:08

回答

3

PCRE要求delimiters将实际正则表达式与optional modifiers分开。使用PHP,您可以使用任何非字母数字,非反斜杠,非空白字符以及成对出现的分隔符(括号)。

在您的情况下,使用前导(作为分隔符,并且第一个对应的关闭)标记正则表达式的结尾;其余被视为修饰符:

([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?) 
^           ^

但结束符(()后的第一个字符是不是有效的改性剂。那为什么错误消息说未知修饰符'('

在大多数情况下,/被用作Perl中的分隔符。但是这需要在正则表达式中每次出现/。因此,选择不在正则表达式中的分隔符是一个不错的选择。在你的情况下,你可以使用像BoltClock建议的#

哦,顺便说一句:像[http://some.url.com/index.php?showtopic=\"]这样的字符类只是所列字符的一个单个字符。所以要么h,t,p,:, /等。如果你的意思是表达http://some.url.com/index.php?showtopic="字面上,只使用http://some\.url\.com/index\.php\?showtopic="(不要忘记逃离元字符)。

+0

感谢球员,但是当我意识到我的表达不正确后,我花了一些时间改变它。 – Anonymous 2010-05-22 16:58:44

6

你需要用分隔符中的正则表达式。任何字符不是一个特殊的元字符PCRE会做,所以我会用#

$url = "#([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)#"; 

您可以了解更多关于在定界符the PHP manual section for PCRE delimiters

+0

感谢球员,但这两个例子都显示了一个错误: 意外的'}',期待'(' 这是在我的字符串匹配,所以这是什么问题,为什么要考虑字符串的内容? – Anonymous 2010-05-22 14:52:43

+0

您可以编辑您的问题以包含包含preg_match_all()调用和分隔正则表达式的代码吗? – BoltClock 2010-05-22 14:54:30

相关问题