PHP: как определить, является ли входная строка арабской

есть ли способ определить язык вводимых данных через поле ввода?

9 ответов


хмм я могу предложить улучшенную версию функции DimaKrasun:

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

ладно, хватит прикалываться!

pekkas предложение использовать Google translate 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_NO_EMPTY для функции preg_split был бы полезен, но из-за ошибки я не использовал его здесь.

вы также можете иметь счетчик для всех наборов символов и посмотреть, какой из них, конечно, наиболее...

и, наконец, вы должны рассмотреть возможность отрезать строку после 200 символов или что-то в этом роде. этого должно быть достаточно, чтобы сказать, какой набор символов используется.

и вы должны сделать некоторую обработку ошибок! как деление на ноль, пустая строка и т. д.! не забывайте об этом, пожалуйста... есть вопросы? комментарий!

Если вы хотите определить язык строки, вы должны разбиться на слова и проверить слова в некоторых предопределенных таблицах. вам не нужно полное словарь, только самые распространенные слова, и он должен работать нормально. токенизация / нормализация также является обязательным! есть библиотеки для этого в любом случае и это не то, что вы просили :) просто хотел упомянуть его


это проверит, является ли строка арабской или имеет арабский текст

текст должен быть UNICODE e.G UTF-8

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

вы можете использовать функцию, которую я написал для вас:

<?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);
}

но пожалуйста, проверите его, перед использованием.

[EDIT 1]

Ваш вопрос: "Как определить, является ли входная строка арабской?- И я ответил на него: что случилось?

[EDIT 2]

читать это - обнаружение языка из строки в PHP

[EDIT 3]

Извините, я переписываю функцию для этого попробуйте:

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

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

Я не знаю PHP для этого, нет.

на Google Перевести Ajax API может быть для вас.

проверьте этот фрагмент Javascript из документов API:Пример: Распознавание Языка


Я предполагаю, что вы имеете в виду строку Unicode... в этом случае просто найдите наличие любого символа с кодом между U+0600–U+06FF (1536-1791) в строке.


PHP библиотека Text_LanguageDetect может обнаружить 52 языка. Он тестируется и устанавливается с помощью composer и PEAR.


используйте регулярное выражение для более короткого и простого ответа

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

это вернет true (1) для арабской строки и 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;
        }
    }