2010-08-22 2 views
16

Есть ли способ определить язык ввода данных через поле ввода?PHP: Как определить, является ли входная строка арабской?

+1

Я предполагаю, что вы имели в виду арабский шрифт, а не арабский язык? Там большое различие. – Rushyo

+2

Что делать, если строка содержит слова с нескольких языков? Пример: 私 не عرب – Lukman

ответ

27

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

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

хорошо, достаточно шутит!

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

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

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

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

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

+0

Ваша функция делает мою голову все нечеткой. Я попытаюсь реализовать его, когда у меня улучшится настроение, и дайте знать, работает ли он на нем. Но из того, что я читал, это выглядит многообещающе. – HyderA

+0

roger, не забудьте включить внешнюю функцию uniord сверху! lemme знает, нужен ли вам какой-нибудь halp –

+0

Словарь - очень хорошая идея, только проблема заключается в том, что за пределами латинского скрипта вы быстро сталкиваетесь с ситуациями, когда внешний контекст меняет символы - например, символы с несколькими глифами. Вы должны быть осторожны, чтобы избегать контекстно-зависимых символов в словаре. – Rushyo

1

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

Google Translate Ajax APIs может быть для вас.

Заканчивать этот Javascript фрагмент из API Docs: Example: Language Detection

+0

Сценарий - это совсем другое дело, чем распознавание языка. – Rushyo

+1

@ Rushyo, на данный момент, он запрашивает * язык *, а не скрипт. –

+0

Взято буквально, да, но я сомневаюсь, что это намерение. – Rushyo

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

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

[EDIT 1]

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

[EDIT 2]

Прочитайте это - Detect language from string in PHP

[EDIT 3]

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

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

«Is Arabic»! = «Содержит« Арабский язык »- название вопроса может быть немного расплывчатым, но вопросный орган более чем ясен, нет? – Piskvor

+1

Если строка является арабской, она содержит арабские буквы или нет? –

+0

Piskvor, RegEx DimaKrasun должен действительно распознавать арабские символы ... не только строку «Arabic». – Rushyo

1

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

+0

Inclusive, для ясности. – Rushyo

+0

Первое, что я подумал о регулярном выражении с U + 0600-U + 06FF, но следующее должно было использовать \ p {Arabic} - в regex, я думаю, что \ p {Arabic} совпадает с U + 0600-U + 06FF, но я не пробовал это –

+0

Я почти уверен, что это то же самое, но этот метод намного быстрее. – Rushyo

5

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

текст должен быть UNICODE, например, UTF-8

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

Он отлично работал. Спасибо огромное! – wpcoder

2
public static function isArabic($string){ 
    if(preg_match('/\p{Arabic}/u', $string)) 
     return true; 
    return false; 
} 
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; 
     } 
    } 
Смежные вопросы