par
Hywan » 15 déc. 2007, 20:10
Parser une URL n'est pas si compliqué que ça. Il suffit de lire les RFCs. Plus particulièrement, la numéro 2396 et 3986.
Elle nous dit entre autre, que la forme d'une URL (ou URI ; mieux) est :
On peut alors appliquer la regex de la RFC :
Code : Tout sélectionner
Regex 1 :
#^(?:([^:/?\#]+):)?(?://([^/?\#]*))?([^?\#]*)(?:\?([^\#]*))?(?:\#(.*))?#
On l'applique sur :
Avec ces expressions régulières, on récupère le scheme, l'
authority, le
path, la
query, et le
fragment (le procole, le nom de domaine, le chemin, la requête, et l'ancre).
Après, on peut appliquer une décomposition additionnelle avec la regex suivante sur l'
authority, qui est de la forme :
L'expression est :
On pourra alors récupérer le nom d'utilisateur, le mot de passe, l'authority plus précis, et le port.
Si tu veux tester toutes les parties de l'URI, jette un oeil à la partie
Appendix A. Collected (A)BNF for URI. Il faut faire en gros 15 autres regex qui se recoupent les unes les autres. Je ne mets le code ici pour ne pas alourdir, surtout que tout se trouve dans les RFCs. Il faut regarder les types alpha, digit, alphabum, mark, gen-delims, sub-delims, reserved, unreserved, pct-encoded, uric, pchar, segment, segment-nz, path-absolute, et reg-name. Rien que ça, oui Monsieur. La plupart se recoupe, ou se recompose, heureusement.
J'ai fais une classe qui gère la validité d'une URI, mais ce sera avec mon framework. J'espère le sortir pour janvier 2008. Je peux néanmoins te fournir les codes avant

. Ou alors (et j'aimerais beaucoup) faire un tutorial pour PHPFrance sur la validation des URIs

.
Voilà, bonne lecture des RFCs !
Parser une URL n'est pas si compliqué que ça. Il suffit de lire les RFCs. Plus particulièrement, la numéro 2396 et 3986.
Elle nous dit entre autre, que la forme d'une URL (ou URI ; mieux) est :
[code]URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ][/code]
On peut alors appliquer la regex de la RFC :
[code]Regex 1 :
#^(?:([^:/?\#]+):)?(?://([^/?\#]*))?([^?\#]*)(?:\?([^\#]*))?(?:\#(.*))?#[/code]
On l'applique sur :
[code]scheme://authority/path/to/file.php?query=value#fragment[/code]
Avec ces expressions régulières, on récupère le scheme, l'[i]authority[/i], le [i]path[/i], la [i]query[/i], et le [i]fragment[/i] (le procole, le nom de domaine, le chemin, la requête, et l'ancre).
Après, on peut appliquer une décomposition additionnelle avec la regex suivante sur l'[i]authority[/i], qui est de la forme :
[code]username:
[email protected]:port[/code]
L'expression est :
[code]Regex 2:
#^(?:([^:@]+):([^@]+)@)?([^:]+)(?::(.*))?$#[/code]
On pourra alors récupérer le nom d'utilisateur, le mot de passe, l'authority plus précis, et le port.
Si tu veux tester toutes les parties de l'URI, jette un oeil à la partie [i]Appendix A. Collected (A)BNF for URI[/i]. Il faut faire en gros 15 autres regex qui se recoupent les unes les autres. Je ne mets le code ici pour ne pas alourdir, surtout que tout se trouve dans les RFCs. Il faut regarder les types alpha, digit, alphabum, mark, gen-delims, sub-delims, reserved, unreserved, pct-encoded, uric, pchar, segment, segment-nz, path-absolute, et reg-name. Rien que ça, oui Monsieur. La plupart se recoupe, ou se recompose, heureusement.
J'ai fais une classe qui gère la validité d'une URI, mais ce sera avec mon framework. J'espère le sortir pour janvier 2008. Je peux néanmoins te fournir les codes avant :). Ou alors (et j'aimerais beaucoup) faire un tutorial pour PHPFrance sur la validation des URIs :).
Voilà, bonne lecture des RFCs !