Finalement, je ne m'explique pas pourquoi \b défini dans une classe via les crochets ne matche pas les délimiteurs de mots. En tout cas avec :
$out = preg_split("/[\b]/Us", $texte);
aucun délimiteur n'est matché, donc preg_split() retourne la chaîne complète, de la même manière que :
preg_match_all("/[\b]/Us", $texte, $out);
ne retourne aucun résultat.
Au sujet de :
preg_split("#\b#", chaîne)
c'est ce que je disais à propos de l'encoding. Par défaut, seuls les caractères de la classe [a-zA-Z0-9_] sont considérés comme des caractères de "mot", l'ASCII non étendu en fait, si je ne m'abuse.
On peut utiliser l'option /u pour analyser les caractères en tant qu'UTF-8.
Le problème est quasiment le même avec str_word_count() qui lui, analyse les chaînes en fonction de la locale définie, mais qui en plus va bugger si c'est de l'UTF-8 car il ne gère pas le multibytes il me semble.
Ce que je voulais dire par ma dernière phrase c'est qu'à mon avis utiliser un pattern de ce type (donc comme tu le faisais) :
1 2
|
$out = preg_split("/[\s;:,!)(etc.]+/", $texte, null, PREG_SPLIT_NO_EMPTY); |
c'est à dire travailler sur ce qu'on veut splitter et non pas sur la notion de 'mot', me semble beaucoup plus portable si on excepte certaines langues particulières comme le Japonais, etc. Un avis personnel bien sûr
(une autre soluce serait de forcer l'utf-8 et d'utiliser plutôt match_all afin de ne pas récupérer les espaces et délimiteurs dans le tableau final comme c'est le cas avec $out = preg_split("/\b/Uu", $texte) :
preg_match_all("`\w+?`Uu", $texte, $out);
)
Partager