OVH Cloud OVH Cloud

Expression reguliere et URL

5 réponses
Avatar
Le Fou
Salut,

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/

5 réponses

Avatar
Guillaume Bouchard
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.

ton url commence soit par http,ftp

http|ftp

( http ou ftp )

Ensuite, tout sauf un espace

[^ ] ( negation de l'espace

plusieurs foix

[^ ]+

donc cela nous donne

(http|ftp)://[^ ]+

donc quelque chose comme

preg_replace('`(http|ftp)://[^ ]+`','<a href="$0">$0</a>',$texte);

$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

Avatar
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/

Avatar
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 ?


Oui.

eregi_replace( "(http|https|ftp)://([[:alnum:]/+-=%&:_.~?]+[#[:alnum:]+]*)",
"<a href="1://2" target="_blank">1://2</a>",$chaine);

(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) ?


Manuel de php c'est assey complet.

http://fr3.php.net/manual/en/pcre.pattern.syntax.php

--
Guillaume.

Avatar
Guillaume Bouchard
Le Fou wrote:
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 ;-))


LXXXVIII. Regular Expression Functions (Perl-Compatible)

--
Guillaume.


Avatar
Le Fou
Guillaume Bouchard 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...


LXXXVIII. Regular Expression Functions (Perl-Compatible)


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/