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

时间:2010-08-22 11:53:17

标签: php language-detection

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

10 个答案:

答案 0 :(得分:30)

嗯,我可能会提供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);
?>

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

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

你也可以为所有角色设置一个计数器,看看当然哪一个...

最后你应该考虑在200个字符之后切断你的字符串。这应该足以说明使用了什么字符集。

你必须做一些错误处理!喜欢除零,空串等等!请不要忘记...任何问题?发表评论!

如果要检测字符串的LANGUAGE,则应拆分为单词并检查某些预定义表中的单词。你不需要一本完整的字典,只需要最常用的单词,它应该可以正常工作。标记化/规范化也是必须的!无论如何都有图书馆,这不是你要求的:)只是想提一下

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:3)

你可以使用我为你写的功能:

<?php
/**
 * Return`s true if string contains only arabic letters.
 *
 * @param string $string
 * @return bool
 */
function is_arabic($string)
{
    return (preg_match("/^\p{Arabic}/i", $string) > 0);
}

但请在使用前检查一下。

[编辑1]

您的问题:“我如何检测输入字符串是否为阿拉伯语?”我已经回答了,出了什么问题?

[编辑2]

阅读本文 - Detect language from string in PHP

[编辑3]

对不起,我重写了这个功能,试试看:

function is_arabic($subject)
{
    return (preg_match("/^[\x0600-\x06FF]/i", $subject) > 0);
}

答案 3 :(得分:1)

我不知道PHP的解决方案,没有。

Google Translate Ajax APIs可能适合你。

从API文档中查看此Javascript代码段:Example: Language Detection

答案 4 :(得分:1)

我假设你指的是一个Unicode字符串......在这种情况下,只需要在字符串中查找U + 0600-U + 06FF(1536-1791)之间代码的任何字符。

答案 5 :(得分:1)

public static function isArabic($string){
    if(preg_match('/\p{Arabic}/u', $string))
        return true;
    return false;
}

答案 6 :(得分:1)

PHP Text_LanguageDetect library能够检测52种语言。它可以通过作曲家和PEAR进行单元测试和安装。

答案 7 :(得分:0)

此功能检查输入的行/句子是否为阿拉伯语。我首先修剪它然后逐字逐句检查计算两者的总数。

function isArabic($string){
        // Initializing count variables with zero
        $arabicCount = 0;
        $englishCount = 0;
        // Getting the cleanest String without any number or Brackets or Hyphen
        $noNumbers = preg_replace('/[0-9]+/', '', $string);
        $noBracketsHyphen = array('(', ')', '-');
        $clean = trim(str_replace($noBracketsHyphen , '', $noNumbers));
        // After Getting the clean string, splitting it by space to get the total entered words 
        $array = explode(" ", $clean); // $array contain the words that was entered by the user
        for ($i=0; $i <= count($array) ; $i++) {
            // Checking either word is Arabic or not
            $checkLang = preg_match('/\p{Arabic}/u', $array[$i]);
            if($checkLang == 1){
                ++$arabicCount;
            } else{
                ++$englishCount;
            }
        }
        if($arabicCount >= $englishCount){
            // Return 1 means TRUE i-e Arabic
            return 1;
        } else{
            // Return 0 means FALSE i-e English
            return 0;
        }
    }

答案 8 :(得分:0)

使用正则表达式来获得更简单的答案

 $is_arabic = preg_match('/\p{Arabic}/u', $text);

这将返回true(1)表示阿拉伯字符串,0表示非阿拉伯字符串

答案 9 :(得分:0)

我将使用正则表达式获取阿拉伯字符的数量并将其与字符串的总长度进行比较。例如,如果文本至少是60%的阿拉伯字符,我会认为它主要是阿拉伯语,并采用RTL格式。

/**
 * Is the given text mainly Arabic language? 
 *
 * @param string $text string to be tested if it is arabic. :-)
 * @return bool 
 */
function ct_is_arabic_text($text) {
    $text = preg_replace('/[ 0-9\(\)\.\,\-\:\n\r_]/', '', $text); // Remove spaces, numbers, punctuation.
    $total_count = mb_strlen($text); // Length of text
    if ($total_count==0)
        return false;
    $arabic_count = preg_match_all("/[اأإء-ي]/ui", $text, $matches); // Number of Arabic characters
    if(($arabic_count/$total_count) > 0.6) { // >60% Arabic chars, its probably Arabic languages
        return true;
    }
    return false;
}

对于内联RTL格式,请使用CSS。 示例类:

.embed-rtl {
 direction: rtl;
 unicode-bidi: normal;
 text-align: right;
}