PHP 怎么PHP语言检测

wen PHP项目 2

本文目录导读:

PHP 怎么PHP语言检测

  1. 检测字符编码
  2. 检测语言
  3. 简单的英文和中文字符检测
  4. 检测Unicode范围(完整示例)
  5. 使用文件头检测(BOM)
  6. 综合检测示例
  7. 注意事项

我来介绍几种在PHP中检测语言/字符编码的方法:

检测字符编码

mb_detect_encoding() - 检测字符串编码

$text = "Hello 世界";
$encoding = mb_detect_encoding($text, ['UTF-8', 'GBK', 'ASCII', 'ISO-8859-1'], true);
echo $encoding; // 输出: UTF-8

mb_check_encoding() - 检查是否特定编码

$text = "Hello World";
if (mb_check_encoding($text, 'UTF-8')) {
    echo "是UTF-8编码";
}

检测语言

使用第三方库 - Text_LanguageDetect

// 通过Composer安装
// composer require pear/text_languagedetect
require_once 'vendor/autoload.php';
$detector = new Text_LanguageDetect();
$text = "This is an English sentence.";
$lang = $detector->detect($text);
// 返回 ['english' => 0.98] 或直接获取语言名
$langName = $detector->detectSimple($text);
echo $langName; // 输出: english

使用Google Cloud Translation API

// 需要安装google/cloud-translate
require_once 'vendor/autoload.php';
use Google\Cloud\Translate\V2\TranslateClient;
$translate = new TranslateClient();
$result = $translate->detectLanguage('Bonjour le monde');
echo $result['languageCode']; // 输出: fr

简单的英文和中文字符检测

function detectChinese($str) {
    return preg_match('/[\x{4e00}-\x{9fff}]/u', $str) > 0;
}
function detectEnglish($str) {
    return preg_match('/^[a-zA-Z\s.,!?\'"-]+$/', $str) > 0;
}
function detectLanguageSimple($text) {
    if (preg_match('/[\x{4e00}-\x{9fff}]/u', $text)) {
        return '中文';
    }
    // 检测日文假名
    if (preg_match('/[\x{3040}-\x{30ff}]/u', $text)) {
        return '日文';
    }
    // 检测韩文
    if (preg_match('/[\x{ac00}-\x{d7af}]/u', $text)) {
        return '韩文';
    }
    // 检测西里尔字母(俄语等)
    if (preg_match('/[\x{0400}-\x{04FF}]/u', $text)) {
        return '斯拉夫语系';
    }
    // 默认返回英文或未知
    if (preg_match('/^[a-zA-Z\s.,!?\'"-]+$/', $text)) {
        return '英文';
    }
    return '无法识别';
}
// 测试
echo detectLanguageSimple("Hello World"); // 英文
echo detectLanguageSimple("你好世界"); // 中文
echo detectLanguageSimple("こんにちは"); // 日文
echo detectLanguageSimple("안녕하세요"); // 韩文

检测Unicode范围(完整示例)

class LanguageDetector {
    public static function detect($text) {
        $text = trim($text);
        if (empty($text)) return 'unknown';
        $patterns = [
            '中文' => '/[\x{4e00}-\x{9fff}\x{3400}-\x{4dbf}]/u',
            '日文' => '/[\x{3040}-\x{309f}\x{30a0}-\x{30ff}]/u', // 平假名和片假名
            '韩文' => '/[\x{ac00}-\x{d7af}\x{1100}-\x{11ff}]/u', // 韩文字母
            '俄语' => '/[\x{0400}-\x{04ff}]/u',
            '阿拉伯语' => '/[\x{0600}-\x{06ff}]/u',
            '希腊语' => '/[\x{0370}-\x{03ff}]/u',
            '泰语' => '/[\x{0e00}-\x{0e7f}]/u',
            '希伯来语' => '/[\x{0590}-\x{05ff}]/u',
            '英语' => '/^[\x{0041}-\x{007a}\x{20}\x{2c}\x{2e}\x{21}\x{3f}]+$/u'
        ];
        foreach ($patterns as $lang => $pattern) {
            if (preg_match($pattern, $text)) {
                return $lang;
            }
        }
        return 'unknown';
    }
}
// 使用
echo LanguageDetector::detect("This is English");
echo LanguageDetector::detect("这是一个测试");

使用文件头检测(BOM)

function detectBOM($file) {
    $handle = fopen($file, 'rb');
    $firstBytes = fread($handle, 3);
    fclose($handle);
    $bomMap = [
        "\xEF\xBB\xBF" => 'UTF-8',
        "\xFE\xFF" => 'UTF-16BE',
        "\xFF\xFE" => 'UTF-16LE',
        "\x00\x00\xFE\xFF" => 'UTF-32BE',
        "\xFF\xFE\x00\x00" => 'UTF-32LE'
    ];
    foreach ($bomMap as $bom => $encoding) {
        if (strpos($firstBytes, $bom) === 0) {
            return $encoding;
        }
    }
    return '未知编码';
}

综合检测示例

function analyzeText($text) {
    $result = [
        'encoding' => '',
        'language' => '',
        'info' => []
    ];
    // 检测编码
    $result['encoding'] = mb_detect_encoding($text, 
        ['UTF-8', 'GB2312', 'GBK', 'BIG5', 'ISO-8859-1'], true);
    // 检测语言
    $result['language'] = LanguageDetector::detect($text);
    // 其他信息
    $result['info']['length'] = mb_strlen($text);
    $result['info']['hasChinese'] = preg_match('/[\x{4e00}-\x{9fff}]/u', $text) > 0;
    $result['info']['hasEnglish'] = preg_match('/[a-zA-Z]/', $text) > 0;
    return $result;
}
// 使用示例
$text = "你好,世界!Hello World!";
print_r(analyzeText($text));

注意事项

  1. 准确性:基于字符范围的检测只能识别字符集,不能100%确定语言
  2. 混合语言:文本可能包含多种语言
  3. 性能:对于大量文本,建议使用专业API或库
  4. 扩展性:可以根据需要添加更多的语言检测规则

根据具体需求选择合适的方法即可,如果只是简单判断中英文,正则表达式就足够了;如果需要更准确的语言识别,建议使用专业的语言检测库。

抱歉,评论功能暂时关闭!