我使用正則表達式來匹配中問的時候,出現了無法匹配的問題,問題如下
PCRE does not support \L, \l, \N{name}, \U, or \u at offset 2
我原來的匹配公式是:
/[\u4e00-\x9fa5]/
然后我在網上找的,下面的解決方案
解決后的匹配方案是:
/^[\x{4e00}-\x{9fa5}]+$/u
下面是具體文章
在做表單驗證時對用戶姓名的驗證規則有以下要求
要求:輸入的內容需要滿足的條件是:
1.允許輸入字符:數字(0-9)、字母(a-z和A-Z)、漢字、下划線(_)、圓點(.)和空格;
2、姓名中間允許有空格;
3、下划線、圓點和空格均為英文狀態輸入法下的字符;
4、姓名前后不允許輸入下划線、圓點、空格和特殊字符
$str = 'abc測試 ef';
if(preg_match('/^[a-zA-Z0-9\u4e00-\u9fa5]+$|^[a-zA-Z0-9\u4e00-\u9fa5][a-zA-Z0-9_\s\ \u4e00-\u9fa5\.]*[a-zA-Z0-9\u4e00-\u9fa5]+$/',$str)){
echo "符合驗證規則";
}else{
echo "不符合驗證規則";
}
執行時報錯:Severity: Warning
Message: preg_match() [function.preg-match]: Compilation failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 12
錯誤的大概意思是:preg_match()[函數。):編譯失敗:PCRE不支持\ \ L,L \ N {名稱},\ U,或\ U在抵消12
后來試了幾次,發現表達式中"\u4e00-\u9fa5" 匹配中文時出問題了,正常情況下匹配中文是這樣寫的啊,所以很納悶,於是在網上搜了搜發現在php中 不支持這樣的表達式匹配中文
網上在一篇“模式修正符”的文章中介紹到:
u(PCRE_UTF8)
此修正符啟用了一個 PCRE 中與 Perl 不兼容的額外功能。模式字符串被當成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起開始檢查模式的 UTF-8 合法性。
既然是不兼容,那php中是如何匹配到中文呢?
仔細查了查發現php中utf-8編碼下用正則表達式匹配漢字的最終正確表達式是:
/^[\x{4e00}-\x{9fa5}]+$/u,
於是將“\u4e00-\u9fa5”替換成“\x{4e00}-\x{9fa5}”進行嘗試。
if(preg_match('/^[a-zA-Z0-9\x{4e00}-\x{9fa5}]+$|^[a-zA-Z0-9\x{4e00}-\x{9fa5}][a-zA-Z0-9_\s\ \x{4e00}-\x{9fa5}\.]*[a-zA-Z0-9\x{4e00}-\x{9fa5}]+$/u',$str)){
echo "符合驗證規則";
}else{
echo "不符合驗證規則";
}
注:表達式的最后也要加上‘u’
最后沒有再報錯並且正則匹配成功了。
原文地址:
http://blog.sina.com.cn/s/blog_8122f6b70101hifb.html