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

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

17
задан philfreo 3 November 2010 в 00:09
поделиться

4 ответа

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

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

ладно, хватит шутить!

Предложение Pekkas использовать google translate api - хорошее! но вы полагаетесь на внешний сервис, что всегда сложнее и т.д.

Я думаю, что подход Rushyos хорош! Просто это не так просто. Я написал для вас следующую функцию, но она не проверена, но должна работать...

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

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

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

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

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

31
ответ дан 30 November 2019 в 10:45
поделиться

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

1
ответ дан 30 November 2019 в 10:45
поделиться

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

<?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);
}
3
ответ дан 30 November 2019 в 10:45
поделиться

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

Однако API-интерфейсы Ajax Google Translate могут быть для вас.

Посмотрите этот фрагмент Javascript из документации API: Пример: определение языка

1
ответ дан 30 November 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: