|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Bonjour à Olivier Miakinen <om+news@miakinen.net> qui nous a écrit :
> Le 19/07/2007 17:24, Cenekemoi a écrit : >> >> n'étant pas au top sur les expressions régulières, j'en recherche une >> qui me permettrait de vider des parties de texte compris entre deux >> mot-clés. >> >> Exemple classique avec les mot-clés '<' et '>' afin de retirer les >> balises Html : new RegExp("<[^>]*>", "g"); > > 1) Syntaxe JavaScript > --------------------- > > Tu peux simplifier l'écriture en écrivant : > /<[^>]*>/g > au lieu de : > new RegExp("<[^>]*>", "g") Oui, merci, je le sais ; je le mettais sous cette forme pour être plus proche du code que je proposais (avec le "<" variable)... > > Bien entendu ça ne marchera que si l'expression ne contient pas de > « / », mais elle peut à priori contenir des « " ». > > 2) Expressions régulières PCRE > ------------------------------ > > Tu peux simplifier l'expression en écrivant : > new RegExp("<.*>", "gU") Désolé, Olivier, mais je te rappelle que PCRE = Perl Compatible Regular Expressions. Si tu utilises le genre d'expression ci-dessus en *javascript*, sous FF tu obtiens le message : "invalid regular expression flag U" ....et une erreur de syntaxe sous IE. Normal, Javascript n'est pas compatible PERL... -- Cordialement, Thierry ;-) |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Le 23/07/2007 10:00, Cenekemoi a écrit :
>> >> Tu peux simplifier l'expression en écrivant : >> new RegExp("<.*>", "gU") > > Désolé, Olivier, mais je te rappelle que PCRE = Perl Compatible Regular > Expressions. > > Si tu utilises le genre d'expression ci-dessus en *javascript*, sous FF > tu obtiens le message : > "invalid regular expression flag U" > > ...et une erreur de syntaxe sous IE. > > Normal, Javascript n'est pas compatible PERL... Ben mince alors ! On m'aurait menti ? Citation du « Standard ECMA-262, 3rd Edition - December 1999 » intitulé « ECMAScript Language Specification », chapitre 15.10 : ----------------------------------------------------------------------- The form and functionality of regular expressions is modelled after the regular expression facility in the Perl 5 programming language. ----------------------------------------------------------------------- Note que tout n'est pas perdu. Même si le flag U n'est pas reconnu, la syntaxe « *? » doit fonctionner pour faire la même chose : new RegExp("_DEB_.*?_FIN_", "gs"); |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
Bonjour à Olivier Miakinen <om+news@miakinen.net> qui nous a écrit :
> PHP est compatible PCRE, mais JavaScript n'est que compatible Perl. > >> Note que tout n'est pas perdu. Même si le flag U n'est pas reconnu, >> la syntaxe « *? » doit fonctionner pour faire la même chose : >> >> new RegExp("_DEB_.*?_FIN_", "gs"); > > Ça c'est à la fois Perl et PCRE, donc ça doit marcher. Si on enlève le "s", tout baigne ! Merci beaucoup... Accessoirement, à quoi est sensé servir le "s" ci-dessus en Perl ? Maintenant, STP, pourrais-tu décrire le rôle dévolu à chacun des trois caractères ".*?", je te remercie d'avance J'ai par ailleurs fini par trouver sur le web ta syntaxe mais encadrée par des parenthèses "(.*?)", quelle différence cela fait-il avec ta proposition ? -- Cordialement, Thierry ;-) |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
Le 23/07/2007 11:54, Cenekemoi a écrit :
> Bonjour à Olivier Miakinen <om+news@miakinen.net> qui nous a écrit : >> PHP est compatible PCRE, mais JavaScript n'est que compatible Perl. >> >>> Note que tout n'est pas perdu. Même si le flag U n'est pas reconnu, >>> la syntaxe « *? » doit fonctionner pour faire la même chose : >>> >>> new RegExp("_DEB_.*?_FIN_", "gs"); >> >> Ça c'est à la fois Perl et PCRE, donc ça doit marcher. > > Si on enlève le "s", tout baigne ! Merci beaucoup... Pourtant, d'après la doc de PCRE c'est bien une option de Perl. > Accessoirement, à quoi est sensé servir le "s" ci-dessus en Perl ? <cit. http://www.pcre.org/pcre.txt> PCRE_DOTALL If this bit is set, a dot metacharater in the pattern matches all char- acters, including those that indicate newline. Without it, a dot does not match when the current position is at a newline. This option is equivalent to Perl's /s option, and it can be changed within a pattern by a (?s) option setting. A negative class such as [^a] always matches newline characters, independent of the setting of this option. </cit.> Explication en français : par défaut, le métacaractère « point » peut représenter n'importe quel caractère *sauf* un saut de ligne. Donc la séquence « .* » ne peut pas aller au delà d'une seule ligne de texte. Du coup, /_DEB_.*_FIN_/ fonctionnera sur ce premier exemple : Essai_DEB_sur une seule ligne_FIN_. .... mais pas sur le suivant : Essai_DEB_sur plusieurs lignes_FIN_. L'option /s (ou PCRE_DOTALL) permet de franchir les sauts de ligne. > Maintenant, STP, pourrais-tu décrire le rôle dévolu à chacun des trois > caractères ".*?", je te remercie d'avance .. = n'importe quel caractère sauf les sauts de ligne (à moins de /s) * = répéter ce qui précède n'importe quel nombre de fois (y compris éventuellement 0 fois), et privilégier le résultat le plus long si plusieurs sont possibles. *? = idem * mais privilégier le résultat le plus court si plusieurs sont possibles. Par exemple, avec la chaîne "_DEB_xx_FIN_ uu _DEB_yy_FIN_" : /_DEB_.*_FIN_/ --> le « .* » trouvera "xx_FIN_ uu _DEB_yy" /_DEB_.*?_FIN_/ --> le « .*? » trouvera "xx", puis "yy". > J'ai par ailleurs fini par trouver sur le web ta syntaxe mais encadrée > par des parenthèses "(.*?)", quelle différence cela fait-il avec ta > proposition ? Aucune, puisque tu ne te sers pas de ces « parenthèses capturantes » (qui retournent les valeurs trouvées dans \1, \2, \3, etc.). Elles sont inutiles ici. |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
Bonjour à Olivier Miakinen <om+news@miakinen.net> qui nous a écrit :
> (...) > L'option /s (ou PCRE_DOTALL) permet de franchir les sauts de ligne. Comme je travaille avec des chaînes sans saut de ligne, je comprend que cela marche sans le "s" >> Maintenant, STP, pourrais-tu décrire le rôle dévolu à chacun des >> trois caractères ".*?", je te remercie d'avance > > . = n'importe quel caractère sauf les sauts de ligne (à moins de /s) > * = répéter ce qui précède n'importe quel nombre de fois (y compris > éventuellement 0 fois), et privilégier le résultat le plus long > si plusieurs sont possibles. > *? = idem * mais privilégier le résultat le plus court si plusieurs > sont possibles. > > Par exemple, avec la chaîne "_DEB_xx_FIN_ uu _DEB_yy_FIN_" : > /_DEB_.*_FIN_/ --> le « .* » trouvera "xx_FIN_ uu _DEB_yy" > /_DEB_.*?_FIN_/ --> le « .*? » trouvera "xx", puis "yy". Merci beaucoup ! Comme d'habitude avec toi, les explications sont limpides et argumentées...du coup, je comprend beaucoup mieux certains rôles particuliers de RegExp que j'ai eu l'occasion de voir -- Cordialement, Thierry ;-) |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
Bonjour à Cenekemoi <thierry@no.spam> qui nous a écrit :
> Merci beaucoup ! Comme d'habitude avec toi, les explications sont > limpides et argumentées...du coup, je comprend beaucoup mieux certains > rôles particuliers de RegExp que j'ai eu l'occasion de voir Olivier, pendant que j'y suis, l'expression "<[^>]*>" (pour enlever les balises html) aurait pu être simplifiée en "<.*?>", n'est-il pas ? Ou bien représente-t-elle autre chose qui m'échappe ? -- Cordialement, Thierry PS: les lignes citées ne sont pas de la flagornerie !... ;-) |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
Le 23/07/2007 15:09, Cenekemoi a écrit :
> Bonjour à Olivier Miakinen <om+news@miakinen.net> qui nous a écrit : >> (...) >> L'option /s (ou PCRE_DOTALL) permet de franchir les sauts de ligne. > > Comme je travaille avec des chaînes sans saut de ligne, je comprend que > cela marche sans le "s" Si jamais tu en avais besoin un jour, il faudrait utiliser l'autre moyen de spécifier « DOTALL », qui est (si j'ai bien compris car je n'ai jamais utilisé cette syntaxe) : "(?s)_DEB_.*?_FIN_" Ou bien, plus simple (enfin... du moins je suis à peu près sûr que ça doit marcher) : "_DEB_(.|\n)*?_FIN_" Et encore plus simple, s'il y a un caractère dont tu sais qu'il n'appartiendra jamais à tes chaînes, par exemple "§" : "_DEB_[^§]*?_FIN_" > [...] Comme d'habitude avec toi, les explications sont > limpides et argumentées...du coup, je comprend beaucoup mieux certains > rôles particuliers de RegExp que j'ai eu l'occasion de voir Merci. Mais si tu as un peu de temps et que tu baragouines suffisamment l'anglais, je te conseille la lecture de <http://www.pcre.org/pcre.txt>. Cela dit, tu peux commencer par une doc plus accessible et en français : <http://fr.php.net/manual/fr/reference.pcre.pattern.syntax.php> <http://fr.php.net/manual/fr/reference.pcre.pattern.modifiers.php> |
|
|
|
#8 |
|
Messages: n/a
Hébergeur: |
Le 23/07/2007 15:36, Cenekemoi a écrit :
> > pendant que j'y suis, l'expression "<[^>]*>" (pour enlever les balises > html) aurait pu être simplifiée en "<.*?>", n'est-il pas ? [OUI] Modulo l'histoire des sauts de ligne, car [^>] accepte tout caractère sauf le >, mais y compris \n. |
|
![]() |
| Outils de la discussion | |
|
|