problème de regex de détection des #

Mammouth du PHP | 505 Messages

16 déc. 2007, 11:38

@beroot.

Je n'antislash pas le point car il est dans un "classe" de caractères [].. Dans une classes, le point n'a pas de signification particulière, pas plus que * ou ?, seul ^-]\ ont des significations particulière au sein d'une classe et leurs significations peu varier en fonction de leur emplacement dans la classe.
Eg [-az] ou [a-z], signifier '-' ou 'a' ou 'z' dans le premier cas, et n'importe quelle minuscule dans le second.

la regexp que je t'ai donné match tous les exemples que tu as cités pour l'instant a l'exception de www.domaine.fr qui, amha, n'est plus réellement une url. A vouloir matcher trop de chose, tu risque de matcher tout ou plus que souhaiter.

Mammouth du PHP | 843 Messages

16 déc. 2007, 11:46

merci pour ce complement d'info :)
mon obfectif à moi était de récuperer tout les type d'url possible (au norme ou nom), pour une simple détection et remplacement dans du comtenu ou je n'autorise pas email et url...
ma classe de filte fonctionne tres bien comme cela (j'ai juste virer le protocole file:/// car trop spécifique Windows et ne tient pas réelement compte des spécification d'une url :-k

en tout cas merci à tous pour vos divers aides :)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 505 Messages

16 déc. 2007, 18:36

Ok. Pour file://, cela n'a rien de spécifique a windows. C'est un protocole comme un autre.

Concernant ta regex, attention aux perfs. Personnellement, plutot que de faire une seul regexp qui match tout, je prendrait la regex qui match les urls aux normes, et je ferais une alternative pour gérer l'exception type www.domain.fr

Pour info,
Avec le sujet

Code : Tout sélectionner

http://www.domaine.fr/dossier/fichier.php?qq=1&qq2=e%20+e:azerty<br />
Ta regexp match 1en 70 etapes, et va faire 230 etapes pour couvrir toute la string, de plus, tu captures 9 chaines... Capture uniquement ce dont tu te serts.

Code : Tout sélectionner

(((file|ed2k|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://)|(file:///)|(www\.))+(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[-a-zA-Z0-9&+@=?#/%_|!:,.;~]*)?
Cette regexp match en 22 étapes et va faire 76 etapes pour couvrir la string

Code : Tout sélectionner

\b(?>file|ed2k|gopher|news|nntp|telnet|https?|ftps?|sftp)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]
En faisant une bete alternative a la regexp précédante, tu ne peux être que gagnants. Déjà, la partie 1 de la regexp est réutilisable pour des url normées, ensuite, en scindant en 2 alternatives, tu simplifies le debug et tu gagnes en perfs.

Ce n'est qu'un avis perso.

Mammouth du PHP | 843 Messages

17 déc. 2007, 11:28

si je comprend bien, je fait une regex comme celle que tu m'a mis en fin de post, puis une pour le url sans protocole? c'est ça :-k

sinon pour ce qui est du protocole file://, j'ai remarqué que sous win il s'ecrit via 3 slash alors que sous linux il m'est pas ecrit mais il s'interprete bien via 2 slash (mac aucune idée)... donc c'est pour ça que je j'ai virer (en cas de doute s'abstenir);)

si quelqu'un a un complement d'info a ce sujet ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 505 Messages

17 déc. 2007, 12:20

En gros c'est ça.
Si tu fais un preg_replace, tu peux faire 2 regexp dans un tableau, cela à le mérite de bien les séparer
Sinon, tu fait tout bêtement des alternative au sens regexp du terme

(regexp1 | regexp2), et si tu ne souhaites pas capturer (gain en perf et ram), (?: regexp1 | regexp2)


Pour les listes des protocoles, je te souhaites bien du courage :)
En voila un court extrait, en sachant que la liste, en fait, n'est pas close. Il manque tous les protocoles p2p, par exemple.

http://www.iana.org/assignments/uri-schemes.html