Existe-t-il un moyen en JavaScript pour vérifier si une chaîne est une URL?
Les RegExes sont exclus car l'URL est très probablement écrite comme stackoverflow
; c'est - à - dire qu'il pourrait ne pas avoir .com
, www
ou http
.
javascript
string
url
Bruno
la source
la source
http
, c'est par défaut pas d'url.<scheme>:<scheme-specific-part>
href
élément d'ancrage, fonctionne lors de l'appelwindow.open(url)
, pointe vers quelque chose qui existe vraiment, fonctionne à l'emplacement du navigateur ou une combinaison des éléments ci-dessus? Vous obtiendrez des réponses très différentes en fonction de celles qui vous intéressent.Réponses:
Une question connexe avec une réponse:
Correspondance URL regex Javascript
Ou ce Regexp de Devshed :
la source
{ title: "Stackoverflow", uri: "http://stackoverflow.com" }
Update: en effet, voir code.google.com/chrome/extensions/bookmarks.htmlinvalid quantifier
. Une idée?SyntaxError: Invalid regular expression: /^(https?://)?((([a-zd]([a-zd-]*[a-zd])*).)+[a-z]{2,}|((d{1,3}.){3}d{1,3}))(:d+)?(/[-a-zd%_.~+]*)*(?[;&a-zd%_.~+=-]*)?(#[-a-zd_]*)?$/: Invalid group
Google Chrome (Version 30.0.1599.101) (Mac OS X: 10.8.5)RegExp
vous devez double échapper les barres obliques inverses - sinon vous obtenez des erreurs comme un groupe non valide .la source
http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&docid=nIv5rk2GyP3hXM&tbnid=isiOkMe3nCtexM:&ved=0CAUQjRw&url=http%3A%2F%2Fanimalcrossing.wikia.com%2Fwiki%2FLion&ei=ygZXU_2fGKbMsQTf4YLgAQ&bvm=bv.65177938,d.aWc&psig=AFQjCNEpBfKnal9kU7Zu4n7RnEt2nerN4g&ust=1398298682009707
start = new Date(); isURL("http://michalstefanow.com"); end = new Date(); diff = end - start; console.log(diff)
J'ai mis une bouilloire, je suis allé aux toilettes, j'ai appelé ma mère et la chose a été faite en un rien de temps ...true
pouraaa
.isURL('12345678901234567890123')
ajoutez quelques caractères supplémentaires et c'est encore pire.Vous pouvez essayer d'utiliser le
URL
constructeur : s'il ne lance pas, la chaîne est une URL valide:Le terme «URL» est défini dans la RFC 3886 (comme URI); il doit commencer par un nom de schéma et le nom du schéma n'est pas limité à http / https.
Exemples notables:
www.google.com
n'est pas une URL valide (schéma manquant)javascript:void(0)
est une URL valide, mais pas HTTPhttp://..
est une URL valide, l'hôte étant..
; s'il résout dépend de votre DNShttps://google..com
est une URL valide, identique à celle ci-dessusSi vous souhaitez vérifier si une chaîne est une URL HTTP valide:
la source
href
attribut pour<a>
. Une URL valide doit commencer par un nom de schéma , par exemplehttps://
.isValidUrl("javascript:void(0)")
http://..
Ouhttp:///a
Plutôt que d'utiliser une expression régulière, je recommanderais d'utiliser un élément d'ancrage.
lorsque vous définissez la
href
propriété d'unanchor
, diverses autres propriétés sont définies.la source
Cependant, si la valeur
href
est liée à n'est pas une URL valide, la valeur de ces propriétés auxiliaires sera la chaîne vide.Modifier: comme indiqué dans les commentaires: si une URL non valide est utilisée, les propriétés de l'URL actuelle peuvent être remplacées.
Donc, tant que vous ne transmettez pas l'URL de la page actuelle, vous pouvez faire quelque chose comme:
la source
a.href
n'est pas valide,parser.host
renvoie le nom d'hôte de la page sur laquelle vous vous trouvez actuellement, pas celui attendufalse
.<a href="invalidurl">
, il n'aller à votre domaine. Il est ajouté à la fin de l'URL actuelle. Chrome fait donc ce qu'il faut en vous donnant le nom d'hôte actuel de l'élément "parser".function isValidURL(str)
: tellement mieux que d'utiliser regex! Je vous remercie!J'utilise la fonction ci-dessous pour valider l'URL avec ou sans
http/https
:la source
https://sdfasdp.ppppppppppp
retour,true
mais la mienne revient,false
ce qui est attendu, je pense.[email protected]
... devrait-il? Je suppose que ça ne devrait pasPour valider l'URL à l'aide de javascript est indiqué ci-dessous
la source
(http|https)
à(?:https?)
; b):{0,1}
à:?
; c)[0-9]
à\d
Comptez sur une bibliothèque: https://www.npmjs.com/package/valid-url
la source
{
dans l'URLAmélioration de la réponse acceptée ...
Permet le symbole @ dans le chemin, par exemple https://medium.com/@techytimo
la source
Voici encore une autre méthode.
la source
new URL(string)
le code de Pavlo. Les deux tests ont des résultats identiques avec tous les cas de bord que j'ai testés. J'aime son code car il est plus simple et n'implique pas de créer des éléments, mais le vôtre est quelques fois plus rapide (probablement parce qu'il ne crée pas l'el après la première utilisation).(Je n'ai pas de représentants pour commenter l' exemple de ValidURL ; par conséquent, postez ceci comme réponse.)
Bien que l'utilisation d'URL relatives au protocole ne soit pas encouragée (l' URL relative au protocole ), elles sont parfois utilisées. Pour valider une telle URL avec une expression régulière, la partie protocole peut être facultative, par exemple:
Comme d'autres l'ont fait remarquer, l'expression régulière ne semble cependant pas être l'approche la mieux adaptée pour valider les URL.
la source
isValidURL("https://[email protected]/13176")
@
. Il ne se bloque pas dans mes navigateurs .Vous pouvez utiliser l' API native URL :
la source
Comme cela a été noté, l'expression rationnelle parfaite est insaisissable mais semble toujours être une approche raisonnable (les alternatives sont les tests côté serveur ou la nouvelle API URL expérimentale ). Cependant, les réponses de haut niveau retournent souvent false pour les URL courantes, mais pire encore, votre application / page se fige pendant des minutes, même sur une chaîne aussi simple que
isURL('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
. Il a été souligné dans certains commentaires, mais n'a probablement pas entré une mauvaise valeur pour le voir. Suspendre comme ça rend ce code inutilisable dans toute application sérieuse. Je pense que c'est dû aux jeux répétés insensibles à la casse dans le code comme((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|' ...
. Retirez le «i» et il ne se bloque pas mais ne fonctionnera bien sûr pas comme vous le souhaitez. Mais même avec l'indicateur ignore case, ces tests rejettent les valeurs unicode élevées qui sont autorisées.Le meilleur déjà mentionné est:
Cela vient de Github segmentio / is-url . La bonne chose à propos d'un référentiel de code est que vous pouvez voir les tests et tous les problèmes ainsi que les chaînes de test qui les parcourent. Il y a une branche qui permettrait aux chaînes de protocole manquantes
google.com
, bien que vous fassiez probablement trop d'hypothèses à ce moment-là. Le référentiel a été mis à jour et je n'ai pas l'intention d'essayer de garder un miroir ici. Il a été divisé en tests séparés pour éviter les redos RegEx qui peuvent être exploités pour les attaques DOS (je ne pense pas que vous ayez à vous en soucier avec js côté client, mais vous devez vous soucier de la suspension de votre page pendant si longtemps que votre visiteur quitte votre site).Il y a un autre référentiel que j'ai vu qui pourrait même être meilleur pour isURL sur dperini / regex-weburl.js , mais il est très complexe. Il a une plus grande liste de tests d'URL valides et invalides. Le simple ci-dessus passe toujours tous les points positifs et ne parvient à bloquer que quelques négatifs impairs,
http://a.b--c.de/
ainsi que les ips spéciaux.Quel que soit votre choix, exécutez-la via cette fonction que j'ai adaptée des tests sur dperini / regex-weburl.js, tout en utilisant l'inspecteur des outils de développement de votre navigateur.
Et puis testez cette chaîne de «a».
Voir cette comparaison des expressions régulières isURL par Mathias Bynens pour plus d'informations avant de publier une expression régulière apparemment géniale.
la source
isURL('a'.repeat(100))
millions de fois / s (la plus complexe de dperini est en fait plus rapide). Certaines des réponses de haut niveau du formulaire ([a-zA-Z] +) * prendraient des heures pour le remplir une fois. Recherchez les fichiers RegEx pour plus d'informations.Je ne peux pas commenter le message le plus proche # 5717133 , mais ci-dessous est la façon dont j'ai compris comment faire fonctionner @ tom-gullen regex.
la source
var pattern = new RegExp('(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$', 'i');
Utilisez validator.js
ES6
Non ES6
Vous pouvez également affiner le comportement de cette fonction en passant un
options
objet facultatif comme deuxième argument deisURL
Voici l'
options
objet par défaut :host_whitelist
ethost_blacklist
peuvent être des tableaux d'hôtes. Ils prennent également en charge les expressions régulières.la source
Une fonction que j'ai utilisée pour valider une "chaîne" d'URL est:
Cette fonction retournera un booléen si la chaîne est une URL.
Exemples:
la source
C'est assez difficile à faire avec une expression rationnelle pure, car les URL présentent de nombreux «inconvénients».
Par exemple, les noms de domaine ont des restrictions compliquées sur les tirets:
une. Il est permis d'avoir plusieurs traits d'union consécutifs au milieu.
b. mais le premier caractère et le dernier caractère du nom de domaine ne peuvent pas être un trait d'union
c. Les 3e et 4e caractères ne peuvent pas être à la fois un trait d'union
De même, le numéro de port ne peut être compris que dans la plage 1-65535. Ceci est facile à vérifier si vous extrayez la partie du port et la convertissez en
int
mais assez difficile à vérifier avec une expression régulière.Il n'existe également aucun moyen simple de vérifier les extensions de domaine valides. Certains pays ont des domaines de second niveau (tels que «co.uk»), ou l'extension peut être un mot long comme «.international». Et de nouveaux TLD sont ajoutés régulièrement. Ce type de choses ne peut être vérifié que par rapport à une liste codée en dur. (voir https://en.wikipedia.org/wiki/Top-level_domain )
Ensuite, il y a les URL des aimants, les adresses ftp, etc. Elles ont toutes des exigences différentes.
Néanmoins, voici une fonction qui gère à peu près tout sauf:
la source
Je pense que l'utilisation de l' API URL native est meilleure qu'un modèle d'expression régulière complexe comme l'a suggéré @pavlo. Il présente cependant certains inconvénients que nous pouvons corriger par du code supplémentaire. Cette approche échoue pour l'URL valide suivante.
Nous pouvons ajouter le protocole manquant au préalable pour éviter cela. Il ne parvient pas non plus à détecter les URL non valides suivantes.
Alors pourquoi vérifier l'url entière? nous pouvons simplement vérifier le domaine. J'ai emprunté l'expression régulière pour vérifier le domaine d' ici .
L'
hostname
attribut est une chaîne vide pourjavascript:void(0)
, il fonctionne donc aussi, et vous pouvez également ajouter un vérificateur d'adresse IP. Je voudrais m'en tenir à la plupart des API natives et j'espère qu'elles commenceront à tout prendre en charge dans un avenir proche.la source
new URL
ne figurent pas dans les tests que j'ai effectués. Cela appelle:http://142.42.1.1 //false
et bloque les chaînes Unicode élevées.La question demande une méthode de validation pour une URL telle que
stackoverflow
, sans le protocole ou aucun point dans le nom d'hôte. Il ne s'agit donc pas de valider la sintax de l'url, mais de vérifier si c'est une url valide, en l'appelant.J'ai essayé plusieurs méthodes pour savoir si l'URL true existe et peut être appelée à partir du navigateur, mais je n'ai trouvé aucun moyen de tester avec javascript l'en-tête de réponse de l'appel:
click()
méthode.'GET'
est très bien, mais a ses diverses limitations en raison deCORS
politiques et ce n'est pas le cas de l'utilisationajax
, car comme l'url peut-être toute en dehors du domaine de mon serveur.https
protocole et lève une exception lors de l'appel des URL non sécurisées.Donc, la meilleure solution à laquelle je peux penser est d'obtenir un outil à
CURL
utiliser en utilisant javascript en essayant quelque chose commecurl -I <url>
. Malheureusement je n'en ai pas trouvé et en apparence ce n'est pas possible. J'apprécierai tout commentaire à ce sujet.Mais au final, j'ai un serveur qui tourne
PHP
et comme j'utilise Ajax pour presque toutes mes demandes, j'ai écrit une fonction côté serveur pour y exécuter la demande curl et revenir au navigateur.En ce qui concerne l'URL d'un seul mot sur la question «stackoverflow», cela
https://daniserver.com.ar/stackoverflow
m'amènera à , où daniserver.com.ar est mon propre domaine.la source
foo
et supposer que c'est http ou https ou .com ou .es ou l'un des innombrables suffixes? Continuez-vous à jeter l'évier de cuisine jusqu'à ce que vous obteniez un vrai?Cela semble être l'un des problèmes les plus difficiles de CS;)
Voici une autre solution incomplète qui fonctionne assez bien pour moi et meilleure que les autres que j'ai vues ici. J'utilise une entrée [type = url] pour cela afin de prendre en charge IE11, sinon il serait beaucoup plus simple d'utiliser window.URL pour effectuer la validation à la place:
Afin d'accepter des entrées incomplètes telles que "www.mydomain.com", il sera également valide en supposant que le protocole est "http" dans ces cas et en renvoyant l'URL valide si l'adresse est valide. Elle retourne false lorsqu'elle n'est pas valide.
Il prend également en charge les domaines IPv4, mais pas IPv6.
la source
Dans mon cas, ma seule exigence est que l'entrée utilisateur ne soit pas interprétée comme un lien relatif lorsqu'elle est placée dans le href d'une balise a et les réponses ici étaient soit un peu OTT pour cela, soit des URL autorisées ne répondant pas à mes exigences, donc cela c'est ce que je veux dire:
La même chose pourrait être réalisée assez facilement sans regex.
la source
ce travail avec moi
la source
Si vous pouvez changer le type d'entrée, je pense que cette solution serait beaucoup plus simple:
Vous pouvez une utilisation simple
type="url"
dans votre entrée et la vérifier aveccheckValidity()
en jsPar exemple:
your.html
your.js
la source
Ce n'est certainement pas l'approche la plus efficace, mais elle est lisible et facile à mettre en forme pour tout ce dont vous avez besoin. Et il est plus facile d'ajouter regex / complexité à partir d'ici. Voici donc une approche très pragmatique
TESTER:
la source
Mathias Bynens a compilé une liste de regex URL bien connus avec des URL de test. Il y a peu de raisons d'écrire une nouvelle expression régulière; choisissez simplement celui qui vous convient le mieux.
Mais le tableau de comparaison de ces expressions régulières montre également qu'il est presque impossible de faire la validation d'URL avec une seule expression régulière. Tous les regex de la liste de Bynens produisent des faux positifs et des faux négatifs.
Je vous suggère d'utiliser un analyseur d'URL existant (par exemple
new URL('http://www.example.com/')
en JavaScript), puis d'appliquer les vérifications que vous souhaitez effectuer par rapport à la forme analysée et normalisée de l'URL resp. ses composants. Utiliser le JavaScriptURL
interface présente l'avantage supplémentaire de n'accepter que les URL réellement acceptées par le navigateur.Vous devez également garder à l'esprit que les URL techniquement incorrectes peuvent toujours fonctionner. Par exemple
http://w_w_w.example.com/
,http://www..example.com/
,http://123.example.com/
tous ont une partie de nom d' hôte invalide mais chaque navigateur je sais vais essayer de les ouvrir sans se plaindre, et lorsque vous spécifiez les adresses IP pour les noms non valides dans/etc/hosts/
ces URL vont même travailler mais seulement sur votre ordinateur.La question n'est donc pas tant de savoir si une URL est valide, mais plutôt quelles URL fonctionnent et doivent être autorisées dans un contexte particulier.
Si vous souhaitez effectuer une validation d'URL, il existe de nombreux détails et cas marginaux faciles à ignorer:
http://user:[email protected]/
.http://www.stackoverflow.com.
).[-0-9a-zA-z]
n'est définitivement plus suffisante.co.uk
et beaucoup d'autres).Laquelle de ces limitations et règles s'applique est une question d'exigences et de goût du projet.
J'ai récemment écrit un validateur d'URL pour une application Web qui convient aux URL fournies par les utilisateurs dans les forums, les réseaux sociaux ou similaires. N'hésitez pas à l'utiliser comme base pour la vôtre:
J'ai également écrit un article de blog The Gory Details of URL Validation avec des informations plus détaillées.
la source
Je change la fonction en Match + fais un changement ici avec les barres obliques et son travail: (http: // et https) les deux
la source
Voici juste une vérification très simple pour vous assurer qu'il existe un protocole valide, et l'extension de domaine doit être de deux caractères ou plus.
la source
Si vous devez également prendre en charge,
https://localhost:3000
utilisez cette version modifiée de l'expression régulière de [Devshed].la source
Il existe quelques tests utilisant le constructeur d'URL qui ne déterminent pas si l'entrée est une chaîne ou un objet URL.
la source
Mise à jour 2020. Pour développer à la fois l'excellente réponse de @iamnewton et @Fernando Chavez Herrera, j'ai commencé à voir
@
être utilisé dans le chemin des URL.Donc, l'expression régulière mise à jour est:
Si vous souhaitez l'autoriser dans la chaîne de requête et le hachage, utilisez:
Cela étant dit, je ne sais pas s'il existe une règle de livre blanc interdisant
@
la chaîne de requête ou le hachage.la source
Il y a déjà beaucoup de réponses, mais voici une autre contribution: Tiré directement du
URL
contrôle de validité du polyfill, utilisez uninput
élément avectype="url"
pour profiter du contrôle de validité intégré du navigateur:La source
la source