8797 sujets

Développement web côté serveur, CMS

Pages :
(reprise du message précédent)

QuentinC a écrit :
Pour modifier le titre du sujet, il faut éditer ton premier post
C'est expliqué dans la charte que tu devrais avoir lue avant de poster.


C'est fait. Il y a quelques mois, j'avais aussi voulu modifier le titre et personne ne m'avais dit comment faire. Evidemment il fallait lire la charte... Smiley smile
Merci pour toutes ces suggestions que je vais tester dans quelques jours.

J'ai une question sur la regexp de florentG : je ne comprends pas ce bout de pattern

.+?


J'ai pensé que ça équivalait à :

.*


mais en fait non...

Est-ce que ça correspond à

(.+)?
QuentinC a écrit :
Au passage, tu as oublié d'échapper un crochet


J'ai l'impression que le fait de ne pas échapper des caractères spéciaux à l'intérieur de [] ne fonctionne pas toujours, malgré ce que dit la doc. En particulier en javascript. Donc j'échappe systématiquement.
a écrit :

J'ai l'impression que le fait de ne pas échapper des caractères spéciaux à l'intérieur de [] ne fonctionne pas toujours, malgré ce que dit la doc. En particulier
en javascript. Donc j'échappe systématiquement.

Pareil. Le seul truc que je me permets de ne pas échapper est le tiret dans une classe de caractères (Ex : [-a-z] ) qui fonctionne partout celui-là, autant en java, en javascript, en mod rewrite apache ou en php.

[mode pub on]
Au passage, j'ai programmé il y a quelque temps un outil de test de regexp en js. Si ça intéresse quelqu'un, je mettrai l'URL.
[mode pub off]

A propos des patterns de ton précédent message, ils ont tous une signification bien différente.

.* recherche une série de caractères quelconques, le plus de caractères possible pour satisfaire la regexp
.*? recherche aussi une série de caractères quelconques, mais prend le moins de caractères possible pour satisfaire la regexp
Maintenant si tu mets + à la place de *, la série de caractères sélectionnée par la regexp ne doit pas être vide, autrement dit contenir au moins un caractère.
Encore autrement dit, .* autorise la chaîne vide alors que .+ pas.

Maintenant pour ce qui est de (.+)? ou (?:.+)? la signification est légèrement différente. Le point d'interrogation indique que l'élément précédent doit se trouver 0 ou 1 fois.
Ici, pris seul, ce pattern est identique à .* car il signifie « 0 ou 1 fois une série de 1 caractère minimum ». 0 fois étant, fatalement, la chaîne vide.
Utiliser cette notation prend tout son sens lorsqu'on adjoint autre chose à la parenthèse du .+.
Par exemple : (#.+)? signifie « un # suivi d'au moins un caractère, ou rien ». Un # seul ne sera donc pas pris en compte...

Je ne sais pas si mes explications sont claires ?
marabbeh a écrit :
J'ai l'impression que le fait de ne pas échapper des caractères spéciaux à l'intérieur de [] ne fonctionne pas toujours, malgré ce que dit la doc.

Exemples ?
marabbeh a écrit :
En particulier en javascript.

Euh... le code là, c'est du PHP, non ?
marabbeh a écrit :
Donc j'échappe systématiquement.

Ouais... ça c'est plutôt la réaction de celui qui ne sait pas trop bien ce qu'il fait. Smiley ohwell
Du genre, je sors sytématiquement avec mon imper... des fois qu'il pleuvrait ! Smiley langue

QuentinC a écrit :
(#.+)? signifie « un # suivi d'au moins un caractère, ou rien ». Un # seul ne sera donc pas pris en compte...

Suis prêt à parier le contraire.
Modifié par Bison (26 Oct 2006 - 21:26)
Bison a écrit :

Absolument pas, la regex est parfaitement correcte en l'état !
$motif='`\[T:[^]]+/?\]`s';


Pourriez-vous argumenter, expliquer?
Bison a écrit :
Suis prêt à parier le contraire.

Tape ça dans la barre d'adresse pour en avoir la preuve :
javascript:alert((/^(#.+)?$/g).test('#'));
QuentinC a écrit :

Tape ça dans la barre d'adresse pour en avoir la preuve :
javascript:alert((/^(#.+)?$/g).test('#'));

STOP ! la donne n'est plus la même, tu as ancré le motif.

Dans ton explication, tu prends (#.+)? de manière totalement libre.
Donc, ce motif utilisé seul prend n'importe quoi y compris un # isolé.

Test :
javascript:alert((/(#.+)?/g).test('#'));
marabbeh a écrit :
Merci pour toutes ces suggestions que je vais tester dans quelques jours.

J'ai une question sur la regexp de florentG : je ne comprends pas ce bout de pattern

.+?

C'est un .* non greedy. Genre si t'as cette chaîne de caractère :
<span>Pouet</span>

Et que tu voudrais récupérer "span". Alors un truc du genre :
<.*>

Va retourner malheureusement "span>Pouet</span", vu que le moteur de regexp va essayer d'appliquer le .* le plus possible. Alors en mettant plutôt :
<.+?>

On aura bien "span", parce que le moteur va arrêter dès que possible Smiley smile
FlorentG a écrit :
On aura bien "span", parce que le moteur va arrêter dès que possible Smiley smile

Non, les chevrons seront aussi matchés, donc tu auras <span>
Smiley langue
GeorgesM a écrit :
Personne ne sait où trouver un testeur de regex en ligne ?
... sans trop de pub...

J'en avais codé un sur expreg.com et je l'ai viré du site à cause de petits malins qui s'amusaientt à y mettre n'importe quoi.

Je suis d'ailleurs occupé à le modifier et je me tâte encore à savoir si je vais mettre les sources à dispo sur expreg.com
Smiley ohwell
Est-ce qu'il gère les modifiers (genre I, u, U, etc.) ? Si c'est le cas, ça m'a l'air pas mal Smiley smile
J'en sais rien, je viens de le faire à l'instant... C'est à vous de me dire si ça marche... je suis très loin d'être un guru en regex...
Ce que je voulais, c'était tester des regex sans pub.
a écrit :

STOP ! la donne n'est plus la même, tu as ancré le motif.
Dans ton explication, tu prends (#.+)? de manière totalement libre.
Donc, ce motif utilisé seul prend n'importe quoi y compris un # isolé.

Ouais mais bon, sinon c'est la porte ouverte à toutes les fenêtres...
A ce moment-là, je peux dire que le motif \d* accepte aussi les lettres ... c'est pas ce qu'on attend habituellement.


[mode pub on]
Sinon, j'avais mon testeur de regexp php personnel... que je n'ai jamais terminé ... je me demande bien pourqoi d'ailleurs, il commençait à être pas mal.
http://quentinc1.free.fr/testdev/phpreg.php
Un bug important, il faut systématiquement doubler les backslashes sinon il ne les prend pas...
[/mode pub off]
QuentinC a écrit :
A ce moment-là, je peux dire que le motif \d* accepte aussi les lettres

Non, on accepte n'importe quoi chiffre ou pas, y compris une chaine vide !
Puis quellle fonction regex est utilisée ?
Un motif seul isolé hors contexte n'a aucun sens.

QuentinC a écrit :
... c'est pas ce qu'on attend habituellement.

Ah non... et pourquoi donc ?

EDIT : un simple preg_replace, fonctionne pas le testeur Smiley ohwell
Modifié par Bison (04 Nov 2006 - 20:15)
Pages :