PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.javascript > Re: Expression régulière...
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
Re: Expression régulière...

Réponse
 
LinkBack Outils de la discussion
Vieux 23/07/2007, 09h00   #1
Cenekemoi
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Expression régulière...

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

  Réponse avec citation
Vieux 23/07/2007, 10h17   #2
Olivier Miakinen
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Expression régulière...

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");
  Réponse avec citation
Vieux 23/07/2007, 10h54   #3
Cenekemoi
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Expression régulière...

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

  Réponse avec citation
Vieux 23/07/2007, 11h23   #4
Olivier Miakinen
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Expression régulière...

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.
  Réponse avec citation
Vieux 23/07/2007, 14h09   #5
Cenekemoi
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Expression régulière...

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

  Réponse avec citation
Vieux 23/07/2007, 14h36   #6
Cenekemoi
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Expression régulière...

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 !... ;-)

  Réponse avec citation
Vieux 23/07/2007, 14h42   #7
Olivier Miakinen
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Expression régulière...

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>
  Réponse avec citation
Vieux 23/07/2007, 14h43   #8
Olivier Miakinen
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Expression régulière...

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.
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 22h10.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,13954 seconds with 16 queries