Je viens de parcourir environ 1600 messages, lire la FAQ du NG, lire plein
d'articles sur les RegExp, je n'y comprends toujours pas plus... ;-)
Est-ce que l'un d'entre vous peut me faire un petit cours avec un exemple
concret :
Dans un texte ($texte) je cherche à encadrer une URL (http, ftp etc.) par
les termes <a href="URL">...</a> afin de rendre l'URL cliquable.
C'est un classique, je sais et j'ai même trouvé des portions de script qui
fonctionnent mais ce que je cherche c'est avant tout comprendre, or là, même
avec le script sous les yeux je ne comprends pas tout.
Alors si vous pouviez m'expliquer PAS A PAS votre façon de faire, je vous
serai éternellement reconnaissant ;-)
Autre question :
Parmi les scripts que j'ai trouvés et qui font ce que je désire, l'un
d'entre eux utilise "preg_replace". Quel est l'avantage d'utiliser une
RegExp PERL par rapport à une RegExp "classique" (POSIX ?) ?
Merci de combler mes lacunes.
--
A'tchao
Le Fou
http://club.exocet.free.fr/
http://perso.club-internet.fr/ehiller/
$0 correspond a toute la chaine qui satisfait l'expression complete ( c'est a dire tout )
` correspond au delimiteur du masque de recherche, tu peut mettre ce que tu veut, mais sache que tu doit echapé par la meme chose les caracteres qui ne sont pas une fin de masque... C'est ce qui arrive quand on utilise / comme delimitieur
le masque http:// donnera
/http://///
Lisible non :) J'ai prit `( ALT_GR + 8 ) car c'est peut courament utilisé.
Parmi les scripts que j'ai trouvés et qui font ce que je désire, l'un d'entre eux utilise "preg_replace". Quel est l'avantage d'utiliser une RegExp PERL par rapport à une RegExp "classique" (POSIX ?) ?
+ De rapidité + d'option + de possibilité
- tu peut mettre pas mal d'option APRES le masque, tels que l'insensibilité a la case - dans le masque en lui meme tu a des trucs sympa tres puissant ( exemple des assertions qui te permettent de repeter ce que tu a deja vu avant )
Cela te permet de faire un truc du genre
XtotoX
X et X etant identique mais inconnu.
+ de fonctions - ereg il y a trois fonctions, ereg et eregi, pour la sensibilité a la casse... et ereg_replace Alors que preg en comporte 4 importante : - preg_match --> meme chose que ereg et eregi - preg_replace --> meme chose que ereg_replace - preg_match_all --> meme chose que preg_match, mais recupere tout les resultats aulieu d'un - preg_replace_callback --> ma preferé, meme chose que preg_replace, sauf que enfaite tu envoie les resultat de la recherche a une fonction qui peut les modifié.
Merci de combler mes lacunes.
Pour moi une lacune est quelque chose que l'on devrais savoir mais que l'on ne sais pas, exemple, j'ai des lacunes en orthographe. Mais par contre, ce n'est pas le fait d'ignorer quelque chose que l'on n'est pas sensé savoir et c'est entierement different, c'ets un manque de conaissance.
Manque de conaissance -> ca arrive a tout le monde et ce n'est pas un tord. Lacunes -> Ca arrive aussi, mais c'est un tord :(
-- Guillaume
Le Fou wrote:
Je viens de parcourir environ 1600 messages, lire la FAQ du NG, lire plein
d'articles sur les RegExp, je n'y comprends toujours pas plus... ;-)
Bravo !! ( pas de ne pas comprandre, mais de chercher :))
Dans un texte ($texte) je cherche à encadrer une URL (http, ftp etc.) par
les termes <a href="URL">...</a> afin de rendre l'URL cliquable.
Bref, L'on va se basser sur une realité fausse, une url ne comporte pas
d'espace.
$0 correspond a toute la chaine qui satisfait l'expression complete (
c'est a dire tout )
` correspond au delimiteur du masque de recherche, tu peut mettre ce que
tu veut, mais sache que tu doit echapé par la meme chose les caracteres
qui ne sont pas une fin de masque... C'est ce qui arrive quand on
utilise / comme delimitieur
le masque http:// donnera
/http://///
Lisible non :) J'ai prit `( ALT_GR + 8 ) car c'est peut courament utilisé.
Parmi les scripts que j'ai trouvés et qui font ce que je désire, l'un
d'entre eux utilise "preg_replace". Quel est l'avantage d'utiliser une
RegExp PERL par rapport à une RegExp "classique" (POSIX ?) ?
+ De rapidité
+ d'option
+ de possibilité
- tu peut mettre pas mal d'option APRES le masque, tels que
l'insensibilité a la case
- dans le masque en lui meme tu a des trucs sympa tres puissant (
exemple des assertions qui te permettent de repeter ce que tu a deja vu
avant )
Cela te permet de faire un truc du genre
XtotoX
X et X etant identique mais inconnu.
+ de fonctions
- ereg il y a trois fonctions, ereg et eregi, pour la sensibilité a la
casse... et ereg_replace Alors que preg en comporte 4 importante :
- preg_match --> meme chose que ereg et eregi
- preg_replace --> meme chose que ereg_replace
- preg_match_all --> meme chose que preg_match, mais recupere tout les
resultats aulieu d'un
- preg_replace_callback --> ma preferé, meme chose que preg_replace,
sauf que enfaite tu envoie les resultat de la recherche a une fonction
qui peut les modifié.
Merci de combler mes lacunes.
Pour moi une lacune est quelque chose que l'on devrais savoir mais que
l'on ne sais pas, exemple, j'ai des lacunes en orthographe. Mais par
contre, ce n'est pas le fait d'ignorer quelque chose que l'on n'est pas
sensé savoir et c'est entierement different, c'ets un manque de conaissance.
Manque de conaissance -> ca arrive a tout le monde et ce n'est pas un tord.
Lacunes -> Ca arrive aussi, mais c'est un tord :(
$0 correspond a toute la chaine qui satisfait l'expression complete ( c'est a dire tout )
` correspond au delimiteur du masque de recherche, tu peut mettre ce que tu veut, mais sache que tu doit echapé par la meme chose les caracteres qui ne sont pas une fin de masque... C'est ce qui arrive quand on utilise / comme delimitieur
le masque http:// donnera
/http://///
Lisible non :) J'ai prit `( ALT_GR + 8 ) car c'est peut courament utilisé.
Parmi les scripts que j'ai trouvés et qui font ce que je désire, l'un d'entre eux utilise "preg_replace". Quel est l'avantage d'utiliser une RegExp PERL par rapport à une RegExp "classique" (POSIX ?) ?
+ De rapidité + d'option + de possibilité
- tu peut mettre pas mal d'option APRES le masque, tels que l'insensibilité a la case - dans le masque en lui meme tu a des trucs sympa tres puissant ( exemple des assertions qui te permettent de repeter ce que tu a deja vu avant )
Cela te permet de faire un truc du genre
XtotoX
X et X etant identique mais inconnu.
+ de fonctions - ereg il y a trois fonctions, ereg et eregi, pour la sensibilité a la casse... et ereg_replace Alors que preg en comporte 4 importante : - preg_match --> meme chose que ereg et eregi - preg_replace --> meme chose que ereg_replace - preg_match_all --> meme chose que preg_match, mais recupere tout les resultats aulieu d'un - preg_replace_callback --> ma preferé, meme chose que preg_replace, sauf que enfaite tu envoie les resultat de la recherche a une fonction qui peut les modifié.
Merci de combler mes lacunes.
Pour moi une lacune est quelque chose que l'on devrais savoir mais que l'on ne sais pas, exemple, j'ai des lacunes en orthographe. Mais par contre, ce n'est pas le fait d'ignorer quelque chose que l'on n'est pas sensé savoir et c'est entierement different, c'ets un manque de conaissance.
Manque de conaissance -> ca arrive a tout le monde et ce n'est pas un tord. Lacunes -> Ca arrive aussi, mais c'est un tord :(
-- Guillaume
P'tit Marcel
Le Fou écrivit:
Est-ce que l'un d'entre vous peut me faire un petit cours avec un exemple concret : Dans un texte ($texte) je cherche à encadrer une URL (http, ftp etc.) par les termes <a href="URL">...</a> afin de rendre l'URL cliquable.
un truc du genre : preg_replace('`(http://|ftp://|mailto:)S+`','<a href="$0">$0</a>',$texte)
Le difficile est d'identifier les url : ici j'ai considéré que tout ce qui commence par ftp:// ou http:// ou mailto: est une url
` indique le début du masque (on peut choisir n'importe quel caractère). Moi je prends ` parce qu'il y a peu de chances d'en avoir besoin *dans* le masque et en plus c'est assez discret. (http://|ftp://|mailto:) signifie que la chaîne doit commencer par http:// OU ftp:// OU mailto: S signifie n'importe quel caractère qui ne soit pas un espace (valable avec les regex pcre mais pas avec posix) on aurait pu aussi mettre [^[:blank:]] qui a le même sens et qui marche aussi en Posix + signifie "répéter 1 à n fois" ` indique la fin du masque Attention à mettre le masque dans une chaîne en guillemets simples ' car les " compliquent pas mal.
Le masque récupère donc une suite de n caractères commençant par ftp: ou http: ou mailto: jusqu'à l'espace suivant
Pour le remplacement, c'est plus simple : là où on trouve $0, la fonction va insérer ce qui a été récupéré par le masque complet.
voir http://www.linuxfocus.org/Francais/July1998/article53.html http://phpfrance.com/tutorials/index.php?page=1&id" http://fr.php.net/manual/fr/pcre.pattern.syntax.php entre autres...
Autre question : Parmi les scripts que j'ai trouvés et qui font ce que je désire, l'un d'entre eux utilise "preg_replace". Quel est l'avantage d'utiliser une RegExp PERL par rapport à une RegExp "classique" (POSIX ?) ?
Les fonctions preg_xx sont supposées un peu plus rapides que les fonctions ereg*, et elles permettent plus de choses (lis la fin de la dernière page que je t'ai indiquée pour t'en convaincre...). En revanche les masque sont lègèrement plus compliquées car il faut ajouter un délimiteur (` dans mon exemple).
eça -- P'tit Marcel statistiques sur les forums modérés : http://www.centrale-lyon.org/ng/
Le Fou écrivit:
Est-ce que l'un d'entre vous peut me faire un petit cours avec un
exemple concret :
Dans un texte ($texte) je cherche à encadrer une URL (http, ftp etc.)
par les termes <a href="URL">...</a> afin de rendre l'URL cliquable.
un truc du genre :
preg_replace('`(http://|ftp://|mailto:)S+`','<a href="$0">$0</a>',$texte)
Le difficile est d'identifier les url : ici j'ai considéré que tout ce qui
commence par ftp:// ou http:// ou mailto: est une url
` indique le début du masque (on peut choisir n'importe quel caractère).
Moi je prends ` parce qu'il y a peu de chances d'en avoir besoin *dans* le
masque et en plus c'est assez discret.
(http://|ftp://|mailto:) signifie que la chaîne doit commencer par http://
OU ftp:// OU mailto:
S signifie n'importe quel caractère qui ne soit pas un espace
(valable avec les regex pcre mais pas avec posix)
on aurait pu aussi mettre [^[:blank:]] qui a le même sens et qui marche
aussi en Posix
+ signifie "répéter 1 à n fois"
` indique la fin du masque
Attention à mettre le masque dans une chaîne en guillemets simples ' car
les " compliquent pas mal.
Le masque récupère donc une suite de n caractères commençant par ftp: ou
http: ou mailto: jusqu'à l'espace suivant
Pour le remplacement, c'est plus simple : là où on trouve $0, la fonction
va insérer ce qui a été récupéré par le masque complet.
voir
http://www.linuxfocus.org/Francais/July1998/article53.html
http://phpfrance.com/tutorials/index.php?page=1&id"
http://fr.php.net/manual/fr/pcre.pattern.syntax.php
entre autres...
Autre question :
Parmi les scripts que j'ai trouvés et qui font ce que je désire, l'un
d'entre eux utilise "preg_replace". Quel est l'avantage d'utiliser une
RegExp PERL par rapport à une RegExp "classique" (POSIX ?) ?
Les fonctions preg_xx sont supposées un peu plus rapides que les fonctions
ereg*, et elles permettent plus de choses (lis la fin de la dernière page
que je t'ai indiquée pour t'en convaincre...). En revanche les masque sont
lègèrement plus compliquées car il faut ajouter un délimiteur (` dans mon
exemple).
eça
--
P'tit Marcel
statistiques sur les forums modérés : http://www.centrale-lyon.org/ng/
Est-ce que l'un d'entre vous peut me faire un petit cours avec un exemple concret : Dans un texte ($texte) je cherche à encadrer une URL (http, ftp etc.) par les termes <a href="URL">...</a> afin de rendre l'URL cliquable.
un truc du genre : preg_replace('`(http://|ftp://|mailto:)S+`','<a href="$0">$0</a>',$texte)
Le difficile est d'identifier les url : ici j'ai considéré que tout ce qui commence par ftp:// ou http:// ou mailto: est une url
` indique le début du masque (on peut choisir n'importe quel caractère). Moi je prends ` parce qu'il y a peu de chances d'en avoir besoin *dans* le masque et en plus c'est assez discret. (http://|ftp://|mailto:) signifie que la chaîne doit commencer par http:// OU ftp:// OU mailto: S signifie n'importe quel caractère qui ne soit pas un espace (valable avec les regex pcre mais pas avec posix) on aurait pu aussi mettre [^[:blank:]] qui a le même sens et qui marche aussi en Posix + signifie "répéter 1 à n fois" ` indique la fin du masque Attention à mettre le masque dans une chaîne en guillemets simples ' car les " compliquent pas mal.
Le masque récupère donc une suite de n caractères commençant par ftp: ou http: ou mailto: jusqu'à l'espace suivant
Pour le remplacement, c'est plus simple : là où on trouve $0, la fonction va insérer ce qui a été récupéré par le masque complet.
voir http://www.linuxfocus.org/Francais/July1998/article53.html http://phpfrance.com/tutorials/index.php?page=1&id" http://fr.php.net/manual/fr/pcre.pattern.syntax.php entre autres...
Autre question : Parmi les scripts que j'ai trouvés et qui font ce que je désire, l'un d'entre eux utilise "preg_replace". Quel est l'avantage d'utiliser une RegExp PERL par rapport à une RegExp "classique" (POSIX ?) ?
Les fonctions preg_xx sont supposées un peu plus rapides que les fonctions ereg*, et elles permettent plus de choses (lis la fin de la dernière page que je t'ai indiquée pour t'en convaincre...). En revanche les masque sont lègèrement plus compliquées car il faut ajouter un délimiteur (` dans mon exemple).
eça -- P'tit Marcel statistiques sur les forums modérés : http://www.centrale-lyon.org/ng/
Guillaume Bouchard
Le Fou wrote:
Un grand merci à Guillaume et P'tit Marcel pour leurs explications très claires.
Non, la je crois qu'il ne faut que remercier P'tit Marcel, moi je fais des explications, mais tres tordus. :)
Je vais encore abuser de vous ;-)
Mais non.
Je vais essayer de traduire l'expression suivante (trouvée sur le net), sauriez-vous me corriger ?
(http|https|ftp):// http:// ou https:// ou ftp:// une fois et une seule.
c'est plutot http https et ftp une foix suivit de ://, cela ne change rien, mais c'est comprit comme cela.
Ne devrait-on pas mettre un ^ au début pour montrer que la chaine commence par ces caractères ? Si oui, où le mettre ? Avant la parenthèse ? Mettre des crochets ?
Non, enfait c'est TOUTE la chaine, alors que je pense que ta chaine doit contenir autre chose que une url.
[[:alnum:]/+-=%&:_.~?]+ Un ou plusieurs des caractères compris entre les crochets.
Oui.
[#[:alnum:]+]* zéro ou plusieurs [# suivi de un ou plusieurs caractères alphanumériques].
Non, c'est zero ou plusieurs # ou caracteres alphanum ou plus ( + ). Entre crochet les caracteres speciaux perdent leur pouvoirs.
Autre question, dans <a href="1://2" j'ai cru comprendre que le "1" et le "2" représentent les expressions comprises entre parenthèses, respectivement la première et la deuxième et s'il y a des parenthèses imbriquées ?
Je conaissais pas cette notation. Mais surement...
J'ai vu une autre notation : 1 et 2 et en pcre il semble que $0 représente toute l'expression...
Non, enfaite tu a x ou $x qui represente la meme chose, mais dans une chaine entre doubles quote, tu doit 'echapper' les , donc tu te retrouve avec deux antislashes.
C'est pour cette raison que il faut de preference :
- toujours utilisé $x, c'est preferable - toujours utilisé des `( ou autre caracteres rare ) comme delimiteur - toujours utilisé des simples quotes pour la chaine.
Le pire que j'ai pu voir un jour c'est un truc du genre
"rep\rep\"
Alors qi'il est plus simple de faire '`reprep`' :)
J'ai pas trouvé de doc là dessus, vous savez où il y en a (pcre et posix) ?
(http|https|ftp)://
http:// ou https:// ou ftp:// une fois et une seule.
c'est plutot http https et ftp une foix suivit de ://, cela ne change
rien, mais c'est comprit comme cela.
Ne devrait-on pas mettre un ^ au début pour montrer que la chaine
commence par ces caractères ? Si oui, où le mettre ? Avant la parenthèse ?
Mettre des crochets ?
Non, enfait c'est TOUTE la chaine, alors que je pense que ta chaine doit
contenir autre chose que une url.
[[:alnum:]/+-=%&:_.~?]+
Un ou plusieurs des caractères compris entre les crochets.
Oui.
[#[:alnum:]+]*
zéro ou plusieurs [# suivi de un ou plusieurs caractères
alphanumériques].
Non, c'est zero ou plusieurs # ou caracteres alphanum ou plus ( + ).
Entre crochet les caracteres speciaux perdent leur pouvoirs.
Autre question, dans <a href="1://2" j'ai cru comprendre que le "1" et le
"2" représentent les expressions comprises entre parenthèses, respectivement
la première et la deuxième et s'il y a des parenthèses imbriquées ?
Je conaissais pas cette notation. Mais surement...
J'ai vu une autre notation : \1 et \2 et en pcre il semble que $0
représente toute l'expression...
Non, enfaite tu a x ou $x qui represente la meme chose, mais dans une
chaine entre doubles quote, tu doit 'echapper' les , donc tu te
retrouve avec deux antislashes.
C'est pour cette raison que il faut de preference :
- toujours utilisé $x, c'est preferable
- toujours utilisé des `( ou autre caracteres rare ) comme delimiteur
- toujours utilisé des simples quotes pour la chaine.
Le pire que j'ai pu voir un jour c'est un truc du genre
"\rep\\rep\\"
Alors qi'il est plus simple de faire
'`reprep`' :)
J'ai pas trouvé de doc là dessus, vous savez où il y en a (pcre et posix) ?
(http|https|ftp):// http:// ou https:// ou ftp:// une fois et une seule.
c'est plutot http https et ftp une foix suivit de ://, cela ne change rien, mais c'est comprit comme cela.
Ne devrait-on pas mettre un ^ au début pour montrer que la chaine commence par ces caractères ? Si oui, où le mettre ? Avant la parenthèse ? Mettre des crochets ?
Non, enfait c'est TOUTE la chaine, alors que je pense que ta chaine doit contenir autre chose que une url.
[[:alnum:]/+-=%&:_.~?]+ Un ou plusieurs des caractères compris entre les crochets.
Oui.
[#[:alnum:]+]* zéro ou plusieurs [# suivi de un ou plusieurs caractères alphanumériques].
Non, c'est zero ou plusieurs # ou caracteres alphanum ou plus ( + ). Entre crochet les caracteres speciaux perdent leur pouvoirs.
Autre question, dans <a href="1://2" j'ai cru comprendre que le "1" et le "2" représentent les expressions comprises entre parenthèses, respectivement la première et la deuxième et s'il y a des parenthèses imbriquées ?
Je conaissais pas cette notation. Mais surement...
J'ai vu une autre notation : 1 et 2 et en pcre il semble que $0 représente toute l'expression...
Non, enfaite tu a x ou $x qui represente la meme chose, mais dans une chaine entre doubles quote, tu doit 'echapper' les , donc tu te retrouve avec deux antislashes.
C'est pour cette raison que il faut de preference :
- toujours utilisé $x, c'est preferable - toujours utilisé des `( ou autre caracteres rare ) comme delimiteur - toujours utilisé des simples quotes pour la chaine.
Le pire que j'ai pu voir un jour c'est un truc du genre
"rep\rep\"
Alors qi'il est plus simple de faire '`reprep`' :)
J'ai pas trouvé de doc là dessus, vous savez où il y en a (pcre et posix) ?
Et moi je suis Fou, c'est pour ça que je comprends ;-)
Yeah, copain !!
- toujours utilisé $x, c'est preferable
même en POSIX ?
Non, mais oublie POSIX :)
Manuel de php c'est assey complet. http://fr3.php.net/manual/en/pcre.pattern.syntax.php
Damned, j'ai la même doc en français et je ne trouve pas ce passage... Sans vouloir abuser, peux-tu me dire comment, en partant de cette pageet en cliquant sur "PHP Manual", retrouver cette page (quel chapitre) ? Sans faire "back" dans le navigateur bien-sûr ;-))
Et moi je suis Fou, c'est pour ça que je comprends ;-)
Yeah, copain !!
- toujours utilisé $x, c'est preferable
même en POSIX ?
Non, mais oublie POSIX :)
Manuel de php c'est assey complet.
http://fr3.php.net/manual/en/pcre.pattern.syntax.php
Damned, j'ai la même doc en français et je ne trouve pas ce passage...
Sans vouloir abuser, peux-tu me dire comment, en partant de cette pageet en
cliquant sur "PHP Manual", retrouver cette page (quel chapitre) ?
Sans faire "back" dans le navigateur bien-sûr ;-))
Et moi je suis Fou, c'est pour ça que je comprends ;-)
Yeah, copain !!
- toujours utilisé $x, c'est preferable
même en POSIX ?
Non, mais oublie POSIX :)
Manuel de php c'est assey complet. http://fr3.php.net/manual/en/pcre.pattern.syntax.php
Damned, j'ai la même doc en français et je ne trouve pas ce passage... Sans vouloir abuser, peux-tu me dire comment, en partant de cette pageet en cliquant sur "PHP Manual", retrouver cette page (quel chapitre) ? Sans faire "back" dans le navigateur bien-sûr ;-))
Ah ! C'est là ! Effectivement, mais ma doc est un peu ancienne, j'ai pas toutes ces explications... Allez, hop, téléchargement doc plus récente ;-) Merci.
-- A'tchao
Le Fou http://club.exocet.free.fr/ http://perso.club-internet.fr/ehiller/
Guillaume Bouchard <gobpower@free.fr> a écrit
Le Fou wrote:
même en POSIX ?
Non, mais oublie POSIX :)
Ca va pas être facile, y'a 15 jours je ne savais même pas que pcre existait
;-)
Damned, j'ai la même doc en français et je ne trouve pas ce passage...
Ah ! C'est là !
Effectivement, mais ma doc est un peu ancienne, j'ai pas toutes ces
explications...
Allez, hop, téléchargement doc plus récente ;-)
Merci.
--
A'tchao
Le Fou
http://club.exocet.free.fr/
http://perso.club-internet.fr/ehiller/
Ah ! C'est là ! Effectivement, mais ma doc est un peu ancienne, j'ai pas toutes ces explications... Allez, hop, téléchargement doc plus récente ;-) Merci.
-- A'tchao
Le Fou http://club.exocet.free.fr/ http://perso.club-internet.fr/ehiller/