PHP RegEx错误未知修饰符'('

时间:2010-05-22 14:44:21

标签: php regex

我有这个正则表达式:

([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吐:“未知修饰符”('“

这也是对preg_match的调用

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

任何人都可以帮我解决这个明显愚蠢的问题

2 个答案:

答案 0 :(得分:6)

您需要将正则表达式包装在分隔符中。任何不是特殊PCRE元字符的字符都可以,所以我将使用#

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

您可以在the PHP manual section for PCRE delimiters中了解有关分隔符的更多信息。

答案 1 :(得分: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=\"]这样的角色类只代表所列字符的一个字符。因此,htp:/等等。如果您的意思是按字面意思表达http://some.url.com/index.php?showtopic=",请使用http://some\.url\.com/index\.php\?showtopic=" 1}}(别忘了逃避元字符)。