|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre à l'essai
![]() Inscription : mai 2007 Messages : 98 ![]() |
Bonjour,
Je dois zapper un truc "tout con", mais avec un preg_match_all, je souhaite créer un table qui contient la liste des mots d'une chaîne de caractères en supposant également que plusieurs espaces doivent compter comme un seul ! Ainsi la chaîne suivante : Citation:
Citation:
|
||
|
|
00
|
|
|
#2 |
|
Membre confirmé
![]() ![]() Lionel ChaumeauDéveloppeur Web Inscription : octobre 2011 Messages : 75 ![]() |
Hello,
Tu peux aussi faire les choses en deux étapes: réduire les espaces successifs >1 en ' ': Code :
$texte = preg_replace('/\s{2,}/', ' ', $texte); et ensuite, tu peux faire un explode . NB: A mon avis, tu dois pouvoir aussi tout faire directement avec preg_split mais je ne l'ai jamais encore utilisée...
__________________
My laptop, my bike and my double-sticks... |
|
|
00
|
|
|
#3 |
![]() ![]() Inscription : septembre 2010 Messages : 7 156 ![]() |
str_word_count ?
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#4 | ||
|
Membre à l'essai
![]() Inscription : mai 2007 Messages : 98 ![]() |
Re,
J'ai utilisé ce bricolage, Code :
![]() Par contre, je pensais (naïvement) pouvoir faire cela proprement avec une regex et un simple preg_match
|
||
|
|
00
|
|
|
#5 | |||
|
Membre confirmé
![]() ![]() Lionel ChaumeauDéveloppeur Web Inscription : octobre 2011 Messages : 75 ![]() |
Citation:
Code :
__________________
My laptop, my bike and my double-sticks... |
|||
|
|
00
|
|
|
#6 | ||
![]() ![]() Inscription : septembre 2010 Messages : 7 156 ![]() |
Code :
__________________
http://blog.stealth35.com/ |
||
|
|
10
|
|
|
#7 | |||
|
Membre confirmé
![]() ![]() Lionel ChaumeauDéveloppeur Web Inscription : octobre 2011 Messages : 75 ![]() |
Citation:
en effet marche aussi pour des séparateurs genre ',', '/'... en plus on peut paramétrer le retour... merci stealth (connaissait po
__________________
My laptop, my bike and my double-sticks... |
|||
|
|
00
|
|
|
#8 |
|
Membre à l'essai
![]() Inscription : mai 2007 Messages : 98 ![]() |
La version avec str_word_count marche .... a peu près (chez moi les accents sont comptés comme séparateur).
Sinon, la soluce de kalimukti marche au poil ![]() Merci à vous |
|
|
00
|
|
|
#9 | ||
|
Membre du Club
![]() Boris conception et traitement de documents xhtml Inscription : août 2011 Messages : 107 ![]() |
Bonjour,
Je ne connaissais pas non plus str_word_count. J'essaierai Par contre, j'utilise preg_split avec un bon paquet de délimiteurs : Code :
|
||
|
|
00
|
|
|
#10 | |||
![]() ![]() Inscription : septembre 2010 Messages : 7 156 ![]() |
Citation:
__________________
http://blog.stealth35.com/ |
|||
|
|
00
|
|
|
#11 |
|
Membre du Club
![]() Boris conception et traitement de documents xhtml Inscription : août 2011 Messages : 107 ![]() |
Merci Stealth de ta suggestion
Effectivement, il y avait plus simple que d'énumérer tous les séparateurs du clavier. (Je voulais permettre à l'utilisateur de définir en toute liberté ses propres séparateurs.) Je corrigerai mon code en conséquence. |
|
|
00
|
|
|
#12 | ||||
|
Membre du Club
![]() Boris conception et traitement de documents xhtml Inscription : août 2011 Messages : 107 ![]() |
Bonjour Stealth,
Il y a peut-être quelque chose que je n'ai pas compris. Lorsque j'utilise l'ancienne regex, le code ci-dessous me génère bien la table des mots. Code :
Code :
Où est l'erreur ? |
||||
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 791 ![]() |
Salut,
c'est dû au fait que tu le mettes entre crochets, du coup le pattern match la 'classe mots'. Par contre, t'auras les espaces considérés comme des mots avec ce pattern. (\b est dépendant de l'encoding et str_word_count() de la localisation définie, il vaut mieux définir le pattern sur le split plutôt que sur ce que tu veux conserver)
__________________
Vive les roues en pierre |
|
|
00
|
|
|
#14 | ||
|
Membre du Club
![]() Boris conception et traitement de documents xhtml Inscription : août 2011 Messages : 107 ![]() |
Citation:
J'avoue ne pas bien comprendre. Dans les exemples de preg_split, on trouve des expressions du type Code :
preg_split("/[\sautres_caractères_de_séparation]+/", chaîne) J'ai essayé la syntaxe J'obtiens une table contenant les mots, mais aussi les espaces, les délimiteurs tels que / ainsi que les caractères accentués qui sont considérés comme délimiteurs (mais non affichés par print_r). Citation:
|
||
|
|
00
|
|
|
#15 | ||
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 791 ![]() |
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 :
Code :
$out = preg_split("/[\b]/Us", $texte); Code :
preg_match_all("/[\b]/Us", $texte, $out); Au sujet de : 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) : Code :
(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) : Code :
preg_match_all("`\w+?`Uu", $texte, $out);
__________________
Vive les roues en pierre |
||
|
|
00
|
|
|
#16 |
![]() ![]() Inscription : septembre 2010 Messages : 7 156 ![]() |
je te déconseille fortement d’utiliser l'opérateur d'exécution (`) pour délimiter tes regex
__________________
http://blog.stealth35.com/ |
|
|
11
|
Copyright © 2000-2012 - www.developpez.com