2010-08-22 34 views

Respuesta

27

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

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

bien, lo suficientemente broma!

Pekkas sugerencia de utilizar la API de Google Translate es una buena! pero usted está confiando en un servicio externo que siempre es más complicado etc.

creo Rushyos approch es bueno! simplemente no es tan fácil. escribí la siguiente función para usted pero no probado, 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 mejor le he añadido, por ejemplo, un contador de América, el rango es sólo un maniquí número b De esta manera 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. .. la bandera PREG_SPLIT_NO_EMPTY para la función preg_split sería útil, sino por el error que no lo usamos aquí.

puede así tener un contador para todos los juegos de caracteres y ver que uno, por supuesto, el más ...

y, finalmente, usted debe considerar cortar la cadena después de 200 caracteres o algo así. esto debería ser suficiente para saber qué conjunto de caracteres se usa.

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

si desea detectar el IDIOMA de una cadena, debe dividir 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 también es imprescindible! hay bibliotecas para que de todos modos y esto no es lo que usted pidió :) sólo quería mencionar que

+0

Tu función hace que mi cabeza se vuelva borrosa. Trataré de implementarlo cuando esté de mejor humor, y le dejaré saber si funcionó. Pero por lo que leo, parece prometedor. – HyderA

+0

roger eso, no te olvides de incluir la función uniord externa en la parte superior! déjame saber si necesitas cualquier medio –

+0

El diccionario es una muy buena idea, el único problema es que fuera del alfabeto latino te encuentras rápidamente con circunstancias en las que el contexto externo cambia los caracteres, como los caracteres con múltiples glifos. Tendría que tener cuidado de evitar caracteres contextuales en su diccionario. – Rushyo

1

No estoy al tanto de una solución PHP para esto, no.

El Google Translate Ajax APIs puede ser para usted, sin embargo.

Control hacia fuera este fragmento de código JavaScript a partir de los documentos de la API: Example: Language Detection

+0

La detección de scripts es algo muy diferente de la detección de idiomas. – Rushyo

+1

@Rushyo bien, en este momento, él está pidiendo la detección de * language * en lugar de script. –

+0

Tomado literalmente, sí, pero dudo que ese sea el intento. – Rushyo

3

Usted puede funcionar, lo que he escrito para que utilice:

<?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, compruebe que, antes de su uso.

[EDIT 1]

Su pregunta: "¿Cómo puedo detectar si una cadena de entrada es el árabe" Y he respondido, ¿qué pasa?

[EDIT 2]

Lea esto - Detect language from string in PHP

[EDIT 3]

excusa, vuelvo a escribir la función de esto, probarlo:

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

"Is Arabic"! = "Contiene 'Arabic'" - el título de la pregunta puede ser un poco vago, pero el cuerpo de la pregunta es más que claro, ¿no? – Piskvor

+1

Si la cuerda es árabe, ¿contiene letras árabes o no? –

+0

Piskvor, RegEx de DimaKrasun debe de hecho detectar caracteres árabes ... no solo la cadena 'árabe'. – Rushyo

1

Supongo que te estás refiriendo a una cadena Unicode ... en cuyo caso, solo busca esencia de cualquier carácter con un código entre U + 0600-U + 06FF (1536-1791) en la cadena.

+0

Inclusive, para mayor claridad. – Rushyo

+0

Lo primero que pensé de regex con U + 0600-U + 06FF, pero luego utilicé \ p {Arabic} - en expresiones regulares, creo que \ p {Arabic} es lo mismo con U + 0600-U + 06FF, pero no lo he intentado –

+0

Estoy bastante seguro de que es lo mismo, pero este método es mucho más rápido. – Rushyo

5

esta comprobará si la cadena es árabe o tiene texto árabe

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."; 
} 
+1

Funcionó perfectamente. Muchas gracias! – wpcoder

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

Esta función comprueba si la línea/frase introducida es árabe o no. Primero lo recorté y luego compruebo palabra por palabra, calculando el recuento total de 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; 
     } 
    } 
Cuestiones relacionadas