php 正則匹配中文(轉)


我使用正則表達式來匹配中問的時候,出現了無法匹配的問題,問題如下

 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM