PHP: Comment puis-je détecter si une chaîne de caractères est arabe

Est-il un moyen de détecter la langue des données saisies via le champ de saisie?

16
demandé sur philfreo 2010-08-22 15:53:17

9 réponses

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

OK, assez plaisanté!

la suggestion de Pekkas d'utiliser l'api de traduction de google est bonne! mais vous comptez sur un service externe qui est toujours plus compliqué, etc.

je pense que L'approche Rushyos est bonne! son tout simplement pas que simple. j'ai écrit la fonction suivante pour vous, mais n'est pas testé, mais ça devrait fonctionner...

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

réflexions finales: comme vous le voyez, j'ai ajouté par exemple un compteur latin, la gamme est juste un nombre fictif mais de cette façon vous pourriez détecter des charsets (Hébreu, latin, arabe, hindi, chinois, etc...)

vous pouvez également vouloir éliminer certains caractères d'abord... peut-être que @, l'espace, les sauts de lignes, barres, etc... le drapeau PREG_SPLIT_NO_EMPTY pour la fonction preg_split serait utile mais à cause du bogue Je ne l'ai pas utilisé ici.

vous pouvez aussi bien avoir un compteur pour tous les jeux de caractères et voir lequel bien sûr le plus...

et finalement vous devriez envisager de couper votre corde après 200 chars ou quelque chose. cela devrait être suffisant pour indiquer quel jeu de caractères est utilisé.

et vous devez faire un peu de gestion des erreurs! comme division par zéro, chaîne vide etc etc! n'oubliez pas que s'il vous plaît... des questions? commentaire!

si vous voulez détecter la langue d'une chaîne de caractères, vous devriez vous diviser en mots et vérifier les mots dans certaines tables prédéfinies. vous n'avez pas besoin d'un complet dictionnaire, juste les mots les plus courants et il devrait fonctionner correctement. la segmentation en unités/la normalisation est un must! il y a des bibliothèques pour cela de toute façon et ce n'est pas ce que vous avez demandé :) je voulais juste le mentionner

28
répondu The Surrican 2015-12-07 03:04:25

ceci vérifiera si la chaîne est arabe ou a du texte arabe

le texte doit être UNICODE E. G UTF-8

$str = "بسم الله";
if (preg_match('/[أ-ي]/ui', $str)) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}
7
répondu Mohammed Ahmed 2013-11-06 21:49:57

Vous pouvez utiliser la fonction, que j'ai écrit pour vous:

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

mais s'il vous plaît, vérifiez, avant l'utilisation.

[EDIT 1]

votre question: "Comment puis-je détecter si une chaîne de caractères est arabe?"Et j'ai répondu à ça, quel est le problème?

[EDIT 2]

Lire cet - Détecter la langue de chaîne de caractères en PHP

[EDIT 3]

Excuse, j'ai la fonction de réécriture de cela, essayez ça:

function is_arabic($subject)
{
    return (preg_match("/^[\x0600-\x06FF]/i", $subject) > 0);
}
3
répondu Dmytro Krasun 2017-05-23 12:26:26
public static function isArabic($string){
    if(preg_match('/\p{Arabic}/u', $string))
        return true;
    return false;
}
2
répondu Mohammad Anini 2013-11-08 16:52:53

Je ne suis pas au courant d'une solution PHP pour cela, non.

Google Translate Ajax APIs peut-être pour vous, mais.

découvrez cet extrait de code Javascript à partir de l'API docs: Exemple: Détection De Langue

1
répondu Pekka 웃 2010-08-22 11:56:06

je suppose que vous faites référence à une chaîne Unicode... dans ce cas, il suffit de rechercher la présence de n'importe quel caractère avec un code entre U+0600–U+06FF (1536-1791) dans la chaîne.

1
répondu Rushyo 2010-08-22 12:23:40

le PHP Text_LanguageDetect library est capable de détecter 52 langues. Il est testé à l'unité et installable via composer et PEAR.

1
répondu cweiske 2017-03-02 17:01:14

Utiliser une expression régulière pour la plus courte et la réponse est facile

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

Cela va renvoyer la valeur true (1) pour l'arabe chaîne et 0 pour non arabe de la chaîne

1
répondu Affan 2018-05-16 10:35:53

cette fonction vérifie si la ligne/phrase saisie est arabe ou non. Je l'ai taillé d'abord, puis j'ai vérifié mot par mot en calculant le nombre total pour les deux.

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;
        }
    }
0
répondu Yasir Tahir 2015-09-30 11:19:13