PHP:如何检测输入字符串是否为阿拉伯语

2022-08-30 21:28:26

有没有办法检测通过输入字段输入的数据的语言?


答案 1

嗯,我可能会提供DimaKrasun函数的改进版本:

functoin is_arabic($string) {
    if($string === 'arabic') {
         return true;
    }
    return false;
}

好吧,开玩笑够了!

Pekkas建议使用谷歌翻译api是一个很好的建议!但是您依赖于外部服务,这总是更复杂等。

我认为Rushyos approch很好!它只是不那么容易。我为您编写了以下函数,但它没有经过测试,但它应该可以正常工作...

    <?
function uniord($u) {
    // i just copied this function fron the php.net comments, but it should work fine!
    $k = mb_convert_encoding($u, 'UCS-2LE', 'UTF-8');
    $k1 = ord(substr($k, 0, 1));
    $k2 = ord(substr($k, 1, 1));
    return $k2 * 256 + $k1;
}
function is_arabic($str) {
    if(mb_detect_encoding($str) !== 'UTF-8') {
        $str = mb_convert_encoding($str,mb_detect_encoding($str),'UTF-8');
    }

    /*
    $str = str_split($str); <- this function is not mb safe, it splits by bytes, not characters. we cannot use it
    $str = preg_split('//u',$str); <- this function woulrd probably work fine but there was a bug reported in some php version so it pslits by bytes and not chars as well
    */
    preg_match_all('/.|\n/u', $str, $matches);
    $chars = $matches[0];
    $arabic_count = 0;
    $latin_count = 0;
    $total_count = 0;
    foreach($chars as $char) {
        //$pos = ord($char); we cant use that, its not binary safe 
        $pos = uniord($char);
        echo $char ." --> ".$pos.PHP_EOL;

        if($pos >= 1536 && $pos <= 1791) {
            $arabic_count++;
        } else if($pos > 123 && $pos < 123) {
            $latin_count++;
        }
        $total_count++;
    }
    if(($arabic_count/$total_count) > 0.6) {
        // 60% arabic chars, its probably arabic
        return true;
    }
    return false;
}
$arabic = is_arabic('عربية إخبارية تعمل على مدار اليوم. يمكنك مشاهدة بث القناة من خلال الموقع'); 
var_dump($arabic);
?>

最后的想法:正如你所看到的,我添加了一个拉丁计数器,范围只是一个虚拟的数字b ut,这样你就可以检测字符集(希伯来语,拉丁语,阿拉伯语,印地语,中文等)

您可能还想先消除一些字符...也许@,空格,换行符,斜杠等...preg_split函数的PREG_SPLIT_NO_EMPTY标志会很有用,但由于错误,我没有在这里使用它。

你也可以为所有字符集设置一个计数器,看看哪一个当然是最...

最后,您应该考虑在200个字符或更多之后将字符串切掉。这应该足以告诉使用什么字符集。

你必须做一些错误处理!如除以零,空字符串等!别忘了请...有问题吗?评论!

如果要检测字符串的语言,则应拆分为单词并检查某些预定义表中的单词。你不需要一个完整的字典,只需要最常见的单词,它应该工作正常。标记化/规范化也是必须的!反正有库,这不是你要求:)只是想提一下


答案 2

这将检查字符串是否为阿拉伯语或具有阿拉伯语文本

文本必须是 UNICODE,例如 UTF-8

$str = "بسم الله";
if (preg_match('/[اأإء-ي]/ui', $str)) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}

推荐