- $str = '中華人民共和國123456789abcdefg';
- echo preg_match("/^[u4e00-u9fa5_a-zA-Z0-9]{3,15}$",$strName);
- ?>
-
複製代碼運行以上代碼,會提示:Warning: preg_match(): Compilation failed: PCRE does not support L, l, N, P, p, U, u, or X at offset 3 in F:wwwrootphptest.php on line 2 原因在於:PHPRegex中不支援下列 Perl 逸出序列:L, l, N, P, p, U, u, or X 在 UTF-8 模式下,允許用“x{...}”,花括弧中的內容是表示十六進位數位字串。 原來的十六進位逸出序列 xhh 如果其值大於 127 的話則匹配了一個雙位元組 UTF-8 字元。解決方案:
- preg_match("/^[x80-xff_a-zA-Z0-9]{3,15}$",$strName);
- preg_match('/[x{2460}-x{2468}]/u', $str);
複製代碼匹配 內碼漢字按照他提供的方式進行測試:
- $str = "php編程";
- if (preg_match("/^[x{2460}-x{2468}]+$/u",$str)) {
- print("該字串全部是中文");
- } else {
- print("該字串不全部是中文");
- }
- ?>
-
複製代碼這樣操作,依然對是否為中文判斷失常。不過,既然x表示的十六進位資料,為什麼和js裡邊提供的範圍x4e00-x9fa5不一樣呢?於是將代碼修改為如下內容:
- $str = "php編程";
- if (preg_match("/^[x4e00-x9fa5]+$/u",$str)) {
- print("該字串全部是中文");
- } else {
- print("該字串不全部是中文");
- }
- ?>
-
複製代碼warning又一次產生了:Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 6 in test.php on line 3接著修改,給“4e00”和“9fa5”兩邊分別用"{"和“}”包起來,跑了一遍,發現這次準確了:
- $str = "php編程";
- if (preg_match("/^[x{4e00}-x{9fa5}]+$/u",$str)) {
- print("該字串全部是中文");
- } else {
- print("該字串不全部是中文");
- }
- ?>
-
複製代碼知道了php中utf-8編碼下用Regex匹配漢字的最終正確運算式:/^[x{4e00}-x{9fa5}]+$/u, 最終版的實現代碼:
- //if (preg_match(“/^[".chr(0xa1)."-".chr(0xff)."]+$/”, $str)) { //只能在GB2312情況下使用
- if (preg_match(“/^[x7f-xff]+$/”, $str)) { //相容gb2312,utf-8
- echo “正確輸入”;
- } else {
- echo “錯誤輸入”;
- }
- ?>
複製代碼例2,
- $action = trim($_GET['action']);
- if($action == "sub")
- {
- $str = $_POST['dir'];
- //if(!preg_match("/^[".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_]+$/",$str)) //GB2312漢字字母數字底線Regex
- if(!preg_match("/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$/u",$str)) //UTF-8漢字字母數字底線Regex
- {
- echo"您輸入的[".$str."]含有違法字元";
- }
- else
- {
- echo "您輸入的[".$str."]完全合法,通過!";
- }
- }
- ?>
-
複製代碼附,php中雙位元組字元編碼範圍 1. GBK (GB2312/GB18030) x00-xff GBK雙位元組編碼範圍x20-x7f ASCIIxa1-xff 中文 gb2312x80-xff 中文 gbk2. UTF-8 (Unicode) u4e00-u9fa5 (中文)x3130-x318F (韓文xAC00-xD7A3 (韓文)u0800-u4e00 (日文)就介紹這些吧,希望有助於大家理解php正則匹配中文的方法。程式員之家,祝大家學習進步。 |