2010-03-09 82 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' 

當然,你也可以使用反斜槓在正則表達式中跳過斜線,但爲什麼要麻煩?