Je cherchais une simple expression régulière pour les URL, est-ce que quelqu'un en a une qui fonctionne bien? Je n'en ai pas trouvé avec les classes de validation du framework zend et j'ai vu plusieurs implémentations.
php
regex
url
validation
AndreLiem
la source
la source
Réponses:
J'ai utilisé ceci sur quelques projets, je ne pense pas avoir rencontré de problèmes, mais je suis sûr que ce n'est pas exhaustif:
La plupart des indésirables aléatoires à la fin sont de traiter des situations comme
http://domain.com.
dans une phrase (pour éviter de faire correspondre le point final). Je suis sûr qu'il pourrait être nettoyé mais depuis cela a fonctionné. Je l'ai plus ou moins simplement copié de projet en projet.la source
google.com
n'est qu'un chemin d'URL relative valide mais pas une URL absolue valide. Et je pense que c'est ce qu'il recherche.http://example.com/somedir/...
est une URL parfaitement légitime, demandant le fichier nommé...
- qui est un nom de fichier légitime.http://www.example
qu'il est valideUtilisez la
filter_var()
fonction pour valider si une chaîne est une URL ou non:Il est déconseillé d'utiliser des expressions régulières lorsque cela n'est pas nécessaire.
EDIT : Attention, cette solution n'est pas sûre unicode et non XSS. Si vous avez besoin d'une validation complexe, il vaut peut-être mieux chercher ailleurs.
la source
http://www
Selon le manuel PHP - parse_url ne doit pas être utilisé pour valider une URL.
Malheureusement, il semble que
filter_var('example.com', FILTER_VALIDATE_URL)
cela ne fonctionne pas mieux.Les deux
parse_url()
etfilter_var()
transmettront des URL malformées telles quehttp://...
Par conséquent, dans ce cas - regex est la meilleure méthode.
la source
Juste au cas où vous voudriez savoir si l'URL existe vraiment:
la source
$url
avant de vérifier que l'URL est réelle parce que l'opération ci-dessus est coûteuse - peut-être jusqu'à 200 millisecondes selon la taille du fichier. Dans certains cas, l'URL peut ne pas avoir de ressource à son emplacement encore disponible (par exemple, créer une URL vers une image qui n'a pas encore été téléchargée). De plus, vous n'utilisez pas de version mise en cache, donc ce n'est pas comme sifile_exists()
cela mettra en cache une statistique sur un fichier et retournera presque instantanément. La solution que vous avez fournie reste cependant utile. Pourquoi ne pas simplement utiliserfopen($url, 'r')
?Selon John Gruber (Daring Fireball):
Regex:
en utilisant dans preg_match ():
Voici le modèle de regex étendu (avec des commentaires):
Pour plus de détails, veuillez consulter: http://daringfireball.net/2010/07/improved_regex_for_matching_urls
la source
Je ne pense pas que l'utilisation d'expressions régulières soit une chose intelligente à faire dans ce cas. Il est impossible de faire correspondre toutes les possibilités et même si vous l'avez fait, il y a toujours une chance que l'URL n'existe tout simplement pas.
Voici un moyen très simple de tester si l'URL existe réellement et est lisible:
(s'il n'y a pas,
preg_match
cela validera également tous les noms de fichiers sur votre serveur)la source
J'ai utilisé celui-ci avec un bon succès - je ne me souviens pas d'où je l'ai obtenu
la source
la source
Et il y a votre réponse =) Essayez de le casser, vous ne pouvez pas !!!
la source
Edit:
Comme l' incidence l'a souligné, ce code a été déprécié avec la sortie de PHP 5.3.0 (30/06/2009) et doit être utilisé en conséquence.
Juste mes deux cents mais j'ai développé cette fonction et l'utilise depuis un moment avec succès. Il est bien documenté et séparé afin que vous puissiez facilement le changer.
la source
la source
Inspiré de cette question .NET StackOverflow et de cet article référencé de cette question, il y a ce validateur d'URI (URI signifie qu'il valide à la fois l'URL et l'URN).
J'ai testé avec succès cette fonction dans un ValueObject que j'ai créé
Uri
et testé parUriTest
.UriTest.php (contient des cas valides et non valides pour les URL et les URN)
Uri.php (objet de valeur)
Unité en cours d'exécution
Il y a 65 affirmations dans 46 tests. Attention: il existe 2 fournisseurs de données pour les expressions valides et 2 autres pour les expressions non valides. L'un est pour les URL et l'autre pour les URN. Si vous utilisez une version de PhpUnit v5.6 * ou antérieure, vous devez joindre les deux fournisseurs de données en un seul.
Couverture de code
Il y a 100% de couverture de code dans cet exemple de vérificateur d'URI.
la source
(http (s?): //) signifie http: // ou https: //
([a-z0-9 -] +.) + => 2.0 [a-z0-9-] signifie tout caractère az ou tout signe 0-9 ou (-))
" /( http (s? ) :// ) ([a- z0-9- < /font>+.)+[ az .{2,4} (.[ az . ) / i "
Remarque: Désolé pour le mauvais anglais. Mon pays ne l'utilise pas bien.
la source
OK, donc c'est un peu plus complexe qu'une simple regex, mais cela permet différents types d'urls.
Exemples:
Tout ce qui doit être marqué comme valide.
Notez qu'il existe une vérification in_array pour les protocoles que vous souhaitez autoriser (actuellement, seuls http et https sont dans cette liste).
la source
La meilleure URL Regex qui a fonctionné pour moi:
Exemples:
Source: http://urlregex.com/
la source
Peter's Regex ne me semble pas correct pour de nombreuses raisons. Il autorise toutes sortes de caractères spéciaux dans le nom de domaine et ne teste pas beaucoup.
La fonction de Frankie me semble bonne et vous pouvez créer une bonne regex à partir des composants si vous ne voulez pas de fonction, comme ceci:
Non testé mais je pense que cela devrait fonctionner.
De plus, la réponse d'Owen ne semble pas non plus à 100%. J'ai pris la partie domaine de l'expression régulière et l'ai testée sur un outil de test Regex http://erik.eae.net/playground/regexp/regexp.html
Je mets la ligne suivante:
dans la section "regexp" et la ligne suivante:
dans la section "exemple de texte".
Le résultat a permis au caractère moins de passer. Parce que \ S signifie tout caractère non espace.
Notez que l'expression régulière de Frankie gère le moins car elle a cette partie pour le premier caractère:
Ce qui ne permettra pas le moins ou tout autre caractère spécial.
la source
Voici comment je l'ai fait. Mais je tiens à souligner que je ne suis pas si sûr de l'expression régulière. Mais ça devrait marcher toi :)
De cette façon, vous n'aurez pas besoin du marqueur d'évaluation sur votre motif.
J'espère que ça aide :)
la source
Voici une classe simple pour la validation d'URL à l' aide de RegEx, puis croise le domaine avec les serveurs RBL (Realtime Blackhole Lists) populaires:
Installer:
Usage:
Ajoutez une URL comme paramètre de la
domain()
méthode et vérifiez le retour.Production:
Comme vous pouvez le voir ci-dessus, www.bokranzr.com est répertorié comme site Web malveillant via un RBL, de sorte que le domaine a été renvoyé comme faux.
la source
Pour tous ceux qui développent avec WordPress, utilisez simplement
pour valider une URL ( voici la documentation de WordPress sur
esc_url_raw
). Il gère bien mieux les URL quefilter_var($url, FILTER_VALIDATE_URL)
parce qu'il est compatible Unicode et XSS. ( Voici un bon article mentionnant tous les problèmes avecfilter_var
).la source
J'ai trouvé que c'était le plus utile pour faire correspondre une URL.
la source
ftp:
?Il existe une fonction native PHP pour cela:
Renvoie les données filtrées, ou FALSE si le filtre échoue.
Vérifiez-le ici
la source