2010-03-09 83 views
0
if (preg_match('(\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+)', '2010/02/14/this-is-something')) 
{ 
    // do stuff 
} 

上面的代码有效。但是这个不是。使用preg_match和unicode的奇怪错误

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匹配]:未知 改性剂“\ “

回答

0

modifier u可从PHP 4.1.0以上在Unix和PHP 4.2.3 win32上。

此外,如您所观察到的nvl,您使用/作为分隔符,并且您不是在正则表达式中转义/存在。所以you'lll必须使用:

/\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}[email protected] 

有一个小窍门,如果您的分隔符存在于您的正则表达式中,则最好选择在正则表达式中找不到的分隔符。这使正则表达式保持简洁。

1

试试这个:(界定与()正则表达式)

if (preg_match('#\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+#', '2010/02/14/this-is-something')) 
{ 
    // do stuff 
} 

编辑

+0

+1,缺少分隔符是原因。 – codaddict 2010-03-09 04:16:09

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' 

当然,你也可以使用反斜杠在正则表达式中跳过斜线,但为什么要麻烦?