首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 中英文正則表達式驗證完整指南

     編輯:PHP 相關知識

PHP 正則表達式驗證中文、英文、數字、混合字串

常見表單驗證需求:純中文、純英文、中英數混合、長度限制等。本文提供實用正則模式與 PHP 驗證函數,並說明編碼注意事項。

常用正則模式對照表

驗證需求正則模式 (UTF-8)說明
純中文 (含標點)`/^[\x{4e00}-\x{9fa5}]+$/u`基本漢字區塊
純中文 (無標點)`/^[\x{4e00}-\x{9fa5}]+$/u`同上
中文+中文標點`/^[\x{4e00}-\x{9fa5}\x{3000}-\x{303f}\xff00-\xffef]+$/u`含全形標點
純英文字母`/^[a-zA-Z]+$/`ASCII 字母
英文+數字`/^[a-zA-Z0-9]+$/`字母數字
中英數混合`/^[\x{4e00}-\x{9fa5}a-zA-Z0-9]+$/u`常用帳號/姓名
中英數+底線`/^[\x{4e00}-\x{9fa5}a-zA-Z0-9_]+$/u`使用者名稱
長度 2-20 字元`/^[\x{4e00}-\x{9fa5}a-zA-Z0-9]{2,20}$/u`加上長度限制

PHP 驗證函數封裝

<?php
class Validator {
    // 純中文 (UTF-8)
    public static function isChinese($str, $allowPunct = false) {
        $pattern = $allowPunct
            ? '/^[\x{4e00}-\x{9fa5}\x{3000}-\x{303f}\xff00-\xffef]+$/u'
            : '/^[\x{4e00}-\x{9fa5}]+$/u';
        return (bool)preg_match($pattern, $str);
    }

    // 純英文
    public static function isEnglish($str) {
        return (bool)preg_match('/^[a-zA-Z]+$/', $str);
    }

    // 英文+數字
    public static function isAlnum($str) {
        return (bool)preg_match('/^[a-zA-Z0-9]+$/', $str);
    }

    // 中英數混合
    public static function isChineseAlnum($str, $allowUnderscore = false) {
        $pattern = $allowUnderscore
            ? '/^[\x{4e00}-\x{9fa5}a-zA-Z0-9_]+$/u'
            : '/^[\x{4e00}-\x{9fa5}a-zA-Z0-9]+$/u';
        return (bool)preg_match($pattern, $str);
    }

    // 長度驗證 (支援多位元組)
    public static function checkLength($str, $min, $max = null) {
        $len = mb_strlen($str, 'UTF-8');
        if ($len < $min) return false;
        if ($max !== null && $len > $max) return false;
        return true;
    }

    // 綜合驗證:姓名 (中文 2-10 字)
    public static function validateChineseName($name) {
        return self::isChinese($name) && self::checkLength($name, 2, 10);
    }

    // 綜合驗證:使用者名稱 (中英數底線 4-20 字)
    public static function validateUsername($username) {
        return self::isChineseAlnum($username, true) && self::checkLength($username, 4, 20);
    }
}

// 使用範例
var_dump(Validator::isChinese('測試中文'));           // true
var_dump(Validator::isChinese('Test123'));           // false
var_dump(Validator::validateChineseName('張三'));     // true
var_dump(Validator::validateUsername('user_123'));   // true
var_dump(Validator::validateUsername('ab'));         // false (太短)
?>

原始碼問題分析與修正

原始碼使用 `ereg` (已棄用/移除)、`x81-xfe` 等 GB2312 位元組範圍,**不適用於 UTF-8 環境**。現代 PHP 必須使用 `preg_match` + `u` 修飾符 + Unicode 碼點範圍。

編碼關鍵點

  • PHP 檔案編碼必須為 UTF-8 無 BOM
  • 資料庫連線字元集:`SET NAMES utf8mb4`
  • HTML 頁面宣告:``
  • 正則 `u` 修飾符:啟用 UTF-8 模式,`\x{xxxx}` 表示 Unicode 碼點
  • 字串長度:用 `mb_strlen()` 而非 `strlen()`

常見 Unicode 區塊參考

區塊範圍說明
CJK 統一表意文字U+4E00-U+9FA5常用漢字 20,902 字
CJK 統一表意文字擴展 AU+3400-U+4DBF罕用字
CJK 符號和標點U+3000-U+303F全形標點、空白
半形及全形形式U+FF00-U+FFEF全形英數字、符號
CJK 統一表意文字擴展 BU+20000-U+2A6DF極罕用字 (需 PHP 7.1+ 支援)

進階:姓名、地址、身分證字號驗證


// 台灣身分證字號
function validateTWID($id) {
    if (!preg_match('/^[A-Z][12]\d{8}$/', $id)) return false;
    $letters = 'ABCDEFGHJKLMNPQRSTUVXYWZIO';
    $nums = [10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,33];
    $c = strtoupper($id[0]);
    $n = $nums[strpos($letters, $c)];
    $sum = (int)($n/10) + ($n%10)*9;
    for ($i=1; $i<=8; $i++) $sum += $id[$i] * (9-$i);
    $sum += $id[9];
    return $sum % 10 === 0;
}

// 手機號碼 (台灣)
function validateTWMobile($mobile) {
    return (bool)preg_match('/^09\d{8}$/', $mobile);
}
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved