使用preg_match和unicode的奇怪错误

时间:2010-03-09 04:02:17

标签: php regex unicode

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]:未知   修饰符'\'

3 个答案:

答案 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'

当然,你也可以使用反斜杠逃避正则表达式中的斜杠,但为什么要这么麻烦呢?