Le 11/07/2008 dans DevBlog

[RegExp] Capturer les URL dans une page web

Une petite expression régulière sur laquelle j’ai passé du temps, et si je peux éviter ça à quelqu’un via Google :)

@<a.*? href=['"]?([^"'s>]*)@i

Voilà ce petit pattern est pas non plus über complexe, mais il est over-capable de capturer les URL dans tous les cas imaginables :)

  • <a href="URL" class="dtc">coucou</a>
  • <a id="dtc" href='URL’>coucou</a>
  • <a href=URL>coucou</a>
  • <a class=dtc HREF=URL id=dtc>coucou</A>

Bon allez je suis chic, je vais même me fendre d’une explication !

Apprenons les Regex avec tonton Damien

@ le pattern @ le flags

Ici j’ai délimité mon pattern avec des @ (on peux mettre un peu ce qu’on veux), et j’ai mis le flag i, qui veux dire insensible à la casse :) (majuscule ou minuscule, il est pas sectaire, il prend tout).

Tout, ou rien

Bon le <a je passe, ça veux dire ce que ça veux dire, mais .*? c’est pas très parlant :)
En gros on dit juste qu’il peux y avoir de tout, ou pas :P (un class="truc", ou rien).
Puis le href= qui nous sert à identifier où se * trouve l’URL.

L’url !

Il faut se la jouer fine, car on peux avoir des « , des ', voir rien du tout pour délimiter notre URL dans l’attribut href.
Alors avec ["']? on dit :  », ', ou pas.
Puis on capture avec une parenthèse parce que l’URL commence :P

La fin de l’url alors ?

Avec ([^"'s>]*) on dit qu’on capture jusqu’à trouver un ', un ", un espace ou un >.

Vous n’avez rien compris ? Go to http://www.regular-expressions.info/.