我有这个正则表达式:
([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);
任何人都可以帮我解决这个明显愚蠢的问题
答案 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=\"]
这样的角色类只代表所列字符的一个字符。因此,h
,t
,p
,:
,/
等等。如果您的意思是按字面意思表达http://some.url.com/index.php?showtopic="
,请使用http://some\.url\.com/index\.php\?showtopic="
1}}(别忘了逃避元字符)。