tag style español definicion attribute php language-detection

style - PHP: ¿Cómo detecto si una cadena de entrada es árabe?



title html español (9)

¿Hay alguna forma de detectar el idioma de los datos que se ingresan a través del campo de entrada?


Esta función verifica si la línea / oración ingresada es árabe o no. Primero lo recorté y luego verifiqué palabra por palabra, calculando el recuento total para ambos.

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




Puedes usar la función que he escrito para ti:

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

Pero por favor, compruébalo, antes de usarlo.

[EDIT 1]

Tu pregunta: "¿Cómo detecto si una cadena de entrada es árabe?" Y le he respondido, ¿qué pasa?

[EDIT 2]

Lee esto - Detecta el lenguaje de una cadena en PHP

[EDIT 3]

Disculpe, reescribo la función a esto, pruébelo:

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


Supongo que se está refiriendo a una cadena Unicode ... en cuyo caso, simplemente busque la presencia de cualquier carácter con un código entre U + 0600 – U + 06FF (1536–1791) en la cadena.


Usa expresiones regulares para respuestas cortas y fáciles

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

Esto devolverá verdadero (1) para la cadena árabe y 0 para la cadena no árabe


esto comprobará si la cadena es árabe o si tiene texto en árabe

el texto debe ser UNICODE, por ejemplo, UTF-8

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


hmm puedo ofrecer una versión mejorada de la función de DimaKrasun:

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

Vale, ¡basta de bromas!

La sugerencia de Pekkas de usar el google translate api es una buena idea! pero confía en un servicio externo que siempre es más complicado, etc.

Creo que Rushyos approch es bueno! Simplemente no es tan fácil. Escribí la siguiente función para usted pero no está probada, pero debería funcionar ...

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

Reflexiones finales: como ve que agregue, por ejemplo, un contador latino, el rango es solo un número ficticio, pero de esta forma podría detectar conjuntos de caracteres (hebreo, latino, árabe, hindi, chino, etc.)

es posible que también desee eliminar algunos caracteres primero ... tal vez @, espacio, saltos de línea, barras inclinadas, etc. ... el indicador PREG_SPLIT_NO_EMPTY para la función preg_split sería útil, pero debido al error no lo usé aquí.

También puede tener un contador para todos los conjuntos de caracteres y ver cuál de ellos es el más ...

y finalmente deberías considerar cortar tu cuerda después de 200 caracteres o algo así. esto debería ser suficiente para indicar qué conjunto de caracteres se utiliza.

y tienes que hacer algun manejo de errores! como división por cero, cadena vacía, etc etc! no olvides que por favor ... alguna pregunta? ¡comentario!

Si desea detectar el LENGUAJE de una cadena, debe dividirse en palabras y buscar las palabras en algunas tablas predefinidas. no necesita un diccionario completo, solo las palabras más comunes y debería funcionar bien. ¡La tokenización / normalización es un deber también! hay bibliotecas para eso de todos modos y esto no es lo que pediste :) solo quería mencionarlo


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