2010-08-22 9 views

risposta

27

hmm io possa offrire una versione migliorata della funzione di DimaKrasun:

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

va bene, abbastanza scherzando!

Il suggerimento di Pekkas di utilizzare google translate api è buono! ma ti stai affidando a un servizio esterno che è sempre più complicato, ecc.

penso che Rushyos sia adatto! non è così facile. ho scritto la seguente funzione per voi, ma la sua non testato, ma dovrebbe funzionare ...

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

pensieri finali: come vedete ho aggiunto ad esempio un contatore latino, la gamma è solo un manichino serie b in questo modo è possibile rilevare charset (ebraico, latino, arabo, hindi, cinese, ecc ...)

si potrebbe anche voler eliminare alcuni caratteri prima ... forse @, spazio, interruzioni di riga, barre, ecc. .. il flag PREG_SPLIT_NO_EMPTY per la funzione preg_split sarebbe utile ma a causa del bug non l'ho usato qui.

si può anche avere un contatore per tutti i set di caratteri e vedere uno che, naturalmente, il più ...

e, infine, si dovrebbe prendere in considerazione tagliare la stringa dopo 200 caratteri o qualcosa del genere. questo dovrebbe essere sufficiente per dire quale set di caratteri è usato.

e devi fare un po 'di gestione degli errori! come divisione per zero, stringa vuota ecc ecc! non dimenticarlo per favore ... qualche domanda? commento!

se si desidera rilevare la LANGUAGE di una stringa, è necessario dividere in parole e verificare le parole in alcune tabelle predefinite. non hai bisogno di un dizionario completo, solo le parole più comuni e dovrebbe funzionare bene. anche la tokenizzazione/normalizzazione è un must! ci sono librerie per che comunque e questo non è quello che hai chiesto :) voleva solo parlare del fatto che

+0

La tua funzione sta facendo perdere la testa. Proverò a implementarlo quando sono di umore migliore e ti faccio sapere se ha funzionato. Ma da quello che ho letto, sembra promettente. – HyderA

+0

roger che, non dimenticare di includere la funzione unord esterna in alto! fammi sapere se hai bisogno di una sola battuta –

+0

Il dizionario è un'ottima idea, il solo problema è che al di fuori dello script latino si incontrano rapidamente circostanze in cui il contesto esterno cambia caratteri, come i caratteri multi-glifo. Dovresti stare attento a evitare i caratteri sensibili al contesto nel tuo dizionario. – Rushyo

1

Non sono a conoscenza di una soluzione PHP per questo, no.

Il Google Translate Ajax APIs potrebbe essere per voi, però.

Partenza questo frammento JavaScript dalla documentazione API: Example: Language Detection

+0

Il rilevamento degli script è una cosa molto diversa dalla rilevazione della lingua. – Rushyo

+1

@Rushyo beh, al momento, sta chiedendo il riconoscimento * lingua * piuttosto che la sceneggiatura. –

+0

Preso alla lettera, sì, ma dubito che sia l'intento. – Rushyo

3

È possibile utilizzare la funzione, che ho scritto per te:

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

Ma per favore, controllare, prima dell'uso.

[EDIT 1]

tua domanda: "Come faccio a rilevare se una stringa di input è l'arabo" E ho risposto ad esso, cosa c'è di sbagliato?

[EDIT 2]

Leggi questo - Detect language from string in PHP

[EDIT 3]

Excuse, riscrivo funzione per questo, provare:

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

"Is Arabic"! = "Contains 'Arabic'" - il titolo della domanda potrebbe essere un po 'vago, ma il corpo della domanda è più che chiaro, no? – Piskvor

+1

Se lo spago è arabo, contiene lettere arabe o no? –

+0

Piskvor, la RegEx di DimaKrasun dovrebbe effettivamente rilevare i caratteri arabi ... non solo la stringa "arabo". – Rushyo

1

Presumo che tu ti stia riferendo a una stringa Unicode ... nel qual caso, cerca il pr esence di qualsiasi carattere con un codice tra U + 0600-U + 06FF (1536-1791) nella stringa.

+0

Inclusive, per chiarezza. – Rushyo

+0

la prima cosa che ho pensato di regex con U + 0600-U + 06FF, ma successivamente era di usare \ p {Arabic} - in regex, credo che \ p {Arabic} sia lo stesso con U + 0600-U + 06FF, ma non l'ho provato –

+0

Sono abbastanza sicuro che sia lo stesso, ma questo metodo è molto più veloce. – Rushyo

5

questo controllerà se la stringa è l'arabo o ha testo arabo

testo deve essere UNICODE ad esempio UTF-8

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

Ha funzionato perfettamente. Grazie mille! – wpcoder

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

Questa funzione verifica se la linea/frase entrato è l'arabo o meno. L'ho ritagliato prima, poi controllo parola per parola calcolando il conteggio totale per entrambi.

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