IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

str_word_count() avec la langue arabe


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 118
    Points : 54
    Points
    54
    Par défaut str_word_count() avec la langue arabe
    Bonjour à tous

    Voici un problème se pose lorsque je veux calculer le nombre d’occurrence d'une chaîne de caractère arabe avec la fonction str_word_count();

    voici mon code php:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php
    header('Content-Type :text/html; charset=utf-8');
    ?>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    ...
    </head>
    <body>
    <?php
    $MaChaineARABE='النص بالعربية لا يعمل مع الدالة ستر ورد كونت';
    $chars='’3à';
    $tab = str_word_count($MaChaineARABE, 2, $chars);
    echo "<br /><br />";
    $occ = array();
    print_r($tab);// affiche : array()!!!
    foreach ($tab as $word)
    {
       if (!isset($occ[$word]))
          $occ[$word] = 0;
          $occ[$word]++;
    }
    $sens= (isset($_GET['sens'])&&($_GET['sens']=='asc'))  ? asort($occ) : arsort($occ);
    foreach($occ as $cle=>$valeur) 
        { 
              echo "<tr><td><a href'#'>$cle</a></td><td>$valeur</td><td align='center'><a href='#'><img src='images/archive.png'  width='16' height='16' title='Archivé le mot' /></a></td></tr>";
    			}
    ?>
    </body>
    Merci de m'aidé à résolu ce problème.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu cherches '’3à' dans une chaine qui ne contient pas '’3à', tu n'obtiens donc rien.

    Tu pourrais utiliser directement de l'arabe plutôt que des entités HTML puisque tu travailles en UTF8.

  3. #3
    Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 118
    Points : 54
    Points
    54
    Par défaut
    je cherche pas '’3à' dans la chaîne c'est pas ça le problème ici juste je demande à la fonction de prendre en compte ces caractères c'est ça le rôle de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $chars='’3à';
    $tab = str_word_count($maChaineNettoyee, 2, $chars);
    Bon le problème reste toujours même si la partie '’3à' ignoré !!!

    je sais pas pourquoi !

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il n'y a pas de ’ ni de à en tout cas.
    Même si je ne comprends pas trop le sens de decouper au caractère "3", ton print_r retourne bien ce découpage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [55] => 3 [113] => 3 [142] => 3 [164] => 3 [229] => 3 [237] => 3 )

  5. #5
    Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 118
    Points : 54
    Points
    54
    Par défaut
    Autrement dit:

    voici le code de nouveau sans les caractères '’3à' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php
    header('Content-Type :text/html; charset=utf-8');
    ?>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    ...
    </head>
    <body>
    <?php
    $MaChaineARABE='النص بالعربية لا يعمل مع الدالة ستر ورد كونت';
    //$chars='’3à';
    $tab = str_word_count($MaChaineARABE, 2);
    echo "<br /><br />";
    $occ = array();
    print_r($tab);// affiche : array()!!!
    foreach ($tab as $word)
    {
       if (!isset($occ[$word]))
          $occ[$word] = 0;
          $occ[$word]++;
    }
    $sens= (isset($_GET['sens'])&&($_GET['sens']=='asc'))  ? asort($occ) : arsort($occ);
    foreach($occ as $cle=>$valeur) 
        { 
              echo "<tr><td><a href'#'>$cle</a></td><td>$valeur</td><td align='center'><a href='#'><img src='images/archive.png'  width='16' height='16' title='Archivé le mot' /></a></td></tr>";
    			}
    ?>
    </body>
    l'array ne retourne rien!

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Dans la doc PHP on trouve une fonction qui semble marcher avec des chaines UTF8 écrites en arabe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    function count_words($string)
    {
        $string = htmlspecialchars_decode(strip_tags($string));
        if (strlen($string)==0)
            return 0;
        $t = array(' '=>1, '_'=>1, "\x20"=>1, "\xA0"=>1, "\x0A"=>1, "\x0D"=>1, "\x09"=>1, "\x0B"=>1, "\x2E"=>1, "\t"=>1, '='=>1, '+'=>1, '-'=>1, '*'=>1, '/'=>1, '\\'=>1, ','=>1, '.'=>1, ';'=>1, ':'=>1, '"'=>1, '\''=>1, '['=>1, ']'=>1, '{'=>1, '}'=>1, '('=>1, ')'=>1, '<'=>1, '>'=>1, '&'=>1, '%'=>1, '$'=>1, '@'=>1, '#'=>1, '^'=>1, '!'=>1, '?'=>1); // separators
        $count= isset($t[$string[0]])? 0:1;
        if (strlen($string)==1)
            return $count;
        for ($i=1;$i<strlen($string);$i++)
            if (isset($t[$string[$i-1]]) && !isset($t[$string[$i]])) // if new word starts
                $count++;
        return $count;
    }
    PS : je viens de comprendre que c'est la forum qui convertir l'arabe en entités dans les balises code

  7. #7
    Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 118
    Points : 54
    Points
    54
    Par défaut
    Merci pour votre réaction appréciable je vais aller testé la fonction.

  8. #8
    Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 118
    Points : 54
    Points
    54
    Par défaut
    j'ai tester la fonction count_words() que vous avez cité dans votre réponse mais il retourne une valeur numérique unique par contre str_word_count() retourne un array() donc la fonction ça marche pas dans mon cas bien dommage!

  9. #9
    Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 118
    Points : 54
    Points
    54
    Par défaut Solution trouvé
    Bonjour

    Après quelque jours de recherche j'ai trouvé cette fonction et ça marche très bien avec l'arabe et d'autre encodage, je vais partager la solution pour les autres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    //********** Equivalent str_word_count version arabe -**************
    if (!function_exists('mb_str_word_count'))
    {
        function mb_str_word_count($string, $format = 0, $charlist = '[]') {
            $string=trim($string);
            if(empty($string))
                $words = array();
            else
                $words = preg_split('~[^\p{L}\p{N}\']+~u',$string);
            switch ($format) {
                case 0:
                    return count($words);
                    break;
                case 1:
                case 2:
                    return $words;
                    break;
                default:
                    return $words;
                    break;
            }
        }
    }
    Merci l'équipe de developpez.net

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Oracle] Utiliser des textes en langue Arabe avec Oracle
    Par hshamsan dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/07/2011, 11h13
  2. Réponses: 0
    Dernier message: 22/02/2010, 08h35
  3. [Joomla!] Template avec la langue arabe par défaut
    Par fraisa1985 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 11/12/2009, 01h32
  4. saisir du texte avec des caracteres en langue arabe
    Par mouna201 dans le forum Delphi
    Réponses: 2
    Dernier message: 21/04/2007, 21h46
  5. edit avec langue arabe
    Par youcef_b_dz dans le forum Bases de données
    Réponses: 1
    Dernier message: 18/08/2006, 20h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo