if (preg_match('(\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+)', '2010/02/14/this-is-something'))
{
// do stuff
}
以上代码有效。然而,这个没有。
if (preg_match('/\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+/u', '2010/02/14/this-is-something'))
{
// do stuff
}
也许有人可以解释为什么下面的那个不起作用。这是正在产生的错误:
遇到PHP错误
严重性:警告
消息:preg_match() [function.preg-match]:未知 修饰符'\'
答案 0 :(得分:1)
试试这个:(用())
分隔正则表达式if (preg_match('#\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+#', '2010/02/14/this-is-something'))
{
// do stuff
}
被修改
答案 1 :(得分:0)
modifier u
可在Unix上使用PHP 4.1.0
或更高版本,在win32上可从PHP 4.2.3
获得。
同样在观察到nvl时,您使用/作为分隔符,并且您没有转义正则表达式中的/ present。所以你必须使用:
/\p{Nd}{4}\/\p{Nd}{2}\/\p{Nd}{2}\/\p{L}+/u
为了避免这种转义,你可以使用一组不同的分隔符,如:
#\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+#
或
@\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+@
作为提示,如果您的正则表达式中存在分隔符,则最好选择在正则表达式中找不到的其他分隔符。这使正则表达式保持干净和短暂。
答案 2 :(得分:0)
在第二个正则表达式中,您使用/
作为正则表达式分隔符,但您也在正则表达式中使用它。编译器试图将此部分解释为完整的正则表达式:
/\p{Nd}{4}/
它认为第二个/
之后的下一个字符应该是'u'或'm'之类的修饰符,但它会看到一个反斜杠,所以它会抛出那个神秘的异常。
在第一个正则表达式中,您使用括号作为正则表达式分隔符;如果你想添加u
修饰符,你可以在结束语后添加它:
'(\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+)u'
尽管使用括号或其他包围字符({}
,[]
,<>
)作为正则表达式分隔符是合法的,但IMO并不是一个好主意。大多数人更喜欢使用一种不太常见的标点字符。例如:
'~\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+~u'
'%\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+%u'
当然,你也可以使用反斜杠逃避正则表达式中的斜杠,但为什么要这么麻烦呢?