6
votes

La fonction Str_Word_Count () ne présente pas correctement la langue arabe

J'ai fait la fonction suivante pour renvoyer un nombre spécifique de mots à partir d'un texte: xxx pré>

et ça fonctionne assez bien avec la langue anglaise mais quand j'essaie de l'utiliser avec une langue arabe Il échoue et ne renvoie pas les mots comme prévu. Par exemple: P>

    function brief_text($string, $number_of_required_words = 50) {
        $string = trim(preg_replace('/\s+/', ' ', $string));
        $words = explode(" ", $string);
        $required_words = array_slice($words, 0, $number_of_required_words); // get sepecific number of elements from the array
        return implode(" ", $required_words);
    }


3 commentaires

Veuillez voter ici pour un mb_str_word_count () Fonction: Bugs.php .net / bug.php? id = 63671


@Amr je parle seulement espagnol et un peu anglais, vous pouvez publier une liste de mots arabes qui ont un espace en eux


Essayez d'utiliser cette fonction, je l'ai essayée et cela fonctionne bien. Stackoverflow.com/a/64319676/3604226


3 Réponses :


4
votes

Essayez avec cette fonction pour le nombre de mots:

// You can call the function as you like
if (!function_exists('mb_str_word_count'))
{
    function mb_str_word_count($string, $format = 0, $charlist = '[]') {
        mb_internal_encoding( 'UTF-8');
        mb_regex_encoding( 'UTF-8');

        $words = mb_split('[^\x{0600}-\x{06FF}]', $string);
        switch ($format) {
            case 0:
                return count($words);
                break;
            case 1:
            case 2:
                return $words;
                break;
            default:
                return $words;
                break;
        }
    };
}



echo mb_str_word_count("القاهرة هى عاصمة مصر وباريس هى عاصمة فرنسا") . PHP_EOL;


9 commentaires

AFAIK, ce nombre de mots ne fonctionnera pas pour le texte arabe. En arabe comme des langues, il y a quelques mots qu'ils ont des espaces dans eux.


Vous pouvez faire une liste de caractères qui sont des séparateurs. Adecional peut construire des exceptions, je suppose que ces mots avec des espaces à l'intérieur doivent avoir une règle pouvant être programmée.


1+ Pour les ressources sur "Un algorithme stemming arabe basé sur des règles" :)


@RKMAX Merci pour les ressources.


Je n'appelerais pas cette fonction mb_str_word_count () car il pourrait casser l'ensemble du système si la fonction native est jamais mise en œuvre.


Ok allez-y et renommez-le à autre chose. La réponse a été mise à jour en effet une meilleure approche :-) 1+ pour ce fonction_existes partie.


J'ai juste ajouté $ Format et $ Charlist Paramètre afin que personne ne soit confondu s'il utilise uniquement le polyfill.


ne fonctionne pas pour certaines langues (c'est-à-dire l'Europe d'Europe de l'Est)


@RKMAX Merci ... C'est le travail pour Persian (Farsi) .Toutes les utilisateurs arabes et persans et autres langues ... Venez ici ( bugs.php.net/bug.php?id=63671 ) et vote pour mb_str_word_count



3
votes

Pour accepter les caractères ASCII aussi:

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


0 commentaires

1
votes

Il y a quelque temps, je voulais calculer le temps de lecture d'un paragraphe et avoir le même problème et je comptais simplement les espaces dans le paragraphe :) (Notez que ce ne sera pas si précis mais cela me convient)

Comme ceci: xxx


2 commentaires

Bonne idée. Et vous pouvez le rendre plus précis en remplaçant tous les espaces multiples avec un seul espace avant d'utiliser la méthode substr_count .


Ouais c'est vrai, il donnera les mots exacts mais dans mon cas, cela n'a pas beaucoup d'importance.