Compte tenu de l'URL (une seule ligne):
http://test.example.com/dir/subdir/file.html
Comment puis-je extraire les parties suivantes à l'aide d'expressions régulières:
- Le sous-domaine (test)
- Le domaine (example.com)
- Le chemin sans le fichier (/ dir / subdir /)
- Le fichier (file.html)
- Le chemin avec le fichier (/dir/subdir/file.html)
- L'URL sans le chemin ( http://test.example.com )
- (ajoutez tout autre que vous jugez utile)
L'expression régulière devrait fonctionner correctement même si j'entre l'URL suivante:
http://example.example.com/example/example/example.html
CrackUrl
. Si une telle fonction existe, utilisez-la, elle est presque garantie d'être plus fiable et plus efficace que n'importe quel code fabriqué à la main.Réponses:
vous pouvez alors analyser plus en détail l'hôte (délimité par '.') assez facilement.
Ce que je ferais, c'est utiliser quelque chose comme ceci:
l'analyse ultérieure «le reste» pour être aussi spécifique que possible. Le faire dans une seule regex est, eh bien, un peu fou.
la source
(.*)?
puisque l'étoile de Kleene accepte déjà 0 ou plus, la?
partie (0 ou 1) la confond. Je l'ai corrigé en changeant(.*)?
en(.+)?
. Vous pouvez également simplement supprimer le?
http://www.example.com:8080/....
Here^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?(:\d+)?)($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?)(:\d+)?($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
^((?P<scheme>[^:/?#]+):(?=//))?(//)?(((?P<login>[^:]+)(?::(?P<password>[^@]+)?)?@)?(?P<host>[^@/?#:]*)(?::(?P<port>\d+)?)?)?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?
code
Vous montrez ce code en action sur pythex.orgJe me rends compte que je suis en retard à la fête, mais il existe un moyen simple de laisser le navigateur analyser une URL pour vous sans regex:
la source
http://
, pour un affichage correct des propriétés de protocole, d'hôte et de nom d'hôte. Sinon, le début de l'url jusqu'au premier slash va à la propriété du protocole.var url = new URL(someUrl)
Je suis en retard de quelques années à la fête, mais je suis surpris que personne n'ait mentionné que la spécification Uniform Resource Identifier contient une section sur l'analyse des URI avec une expression régulière . L'expression régulière, écrite par Berners-Lee, et al., Est:
Pour ce que ça vaut, j'ai trouvé que je devais échapper aux barres obliques en JavaScript:
^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
la source
1
:: Cela traite correctement d'autres protocoles, tels queftp://
etmailto://
.2
: Cela traite correctementusername
etpassword
. Ces champs optionnels sont séparés par deux points, tout comme le nom d'hôte et le port, et cela déclenchera la plupart des autres expressions régulières que j'ai vues. @ RémyDAVID La chaîne de requête n'est pas non plus analysée normalement par l'location
objet navigateur . Si vous avez besoin d'analyser la chaîne de requête, jetez un œil à ma petite bibliothèque pour cela: uqs .user:[email protected]
- RFC 3986 dit:A path segment that contains a colon character (e.g., "this:that") cannot be used as the first segment of a relative-path reference, as it would be mistaken for a scheme name. Such a segment must be preceded by a dot-segment (e.g., "./this:that") to make a relative- path reference.
J'ai trouvé que la réponse la plus votée (la réponse de hometoast) ne fonctionne pas parfaitement pour moi. Deux problèmes:
Ce qui suit est une version modifiée:
La position des pièces est la suivante:
Modifier publié par un utilisateur anon:
la source
http://www.example.com
ou si le chemin est un seul caractère commehttp://www.example.com/a
.J'avais besoin d'une expression régulière pour correspondre à toutes les URL et j'ai créé celle-ci:
Il correspond à toutes les URL, à tous les protocoles, même aux URL comme
Le résultat (en JavaScript) ressemble à ceci:
Une URL comme
ressemble à ça:
la source
/(?:([^\:]*)\:\/\/)?(?:([^\:\@]*)(?:\:([^\@]*))?\@)?(?:([^\/\:]*))?(?:\:([0-9]*))?\/(\/[^\?#]*(?=.*?\/)\/)?([^\?#]*)?(?:\?([^#]*))?(?:#(.*))?/
J'essayais de résoudre ce problème en javascript, qui devrait être géré par:
depuis (au moins dans Chrome), il analyse:
Cependant, ce n'est pas un navigateur croisé ( https://developer.mozilla.org/en-US/docs/Web/API/URL ), j'ai donc bricolé cela pour extraire les mêmes parties que ci-dessus:
Le crédit pour cette expression régulière va à https://gist.github.com/rpflorence qui a publié ce jsperf http://jsperf.com/url-parsing (trouvé à l'origine ici: https://gist.github.com/jlong/2428561 # comment-310066 ) qui a créé l'expression régulière sur laquelle elle était basée à l'origine.
Les pièces sont dans cet ordre:
Il existe également une petite bibliothèque qui l'encapsule et fournit des paramètres de requête:
https://github.com/sadams/lite-url (également disponible sur bower)
Si vous avez une amélioration, veuillez créer une pull request avec plus de tests et j'accepterai et fusionnerai avec merci.
la source
http://test1.dev.mydomain.com/
par exemple, il se retireraittest1.dev.
.Proposez une solution beaucoup plus lisible (en Python, mais s'applique à n'importe quelle regex):
Impressions:
la source
le sous-domaine et le domaine sont difficiles car le sous-domaine peut avoir plusieurs parties, tout comme le domaine de premier niveau, http://sub1.sub2.domain.co.uk/
(Markdown n'est pas très convivial pour les expressions régulières)
la source
(http(s?)://[^/]+/)
pour également saisir httpsCette version améliorée devrait fonctionner de manière aussi fiable qu'un analyseur syntaxique.
la source
Essayez ce qui suit:
Il prend en charge HTTP / FTP, sous-domaines, dossiers, fichiers, etc.
Je l'ai trouvé à partir d'une recherche rapide sur Google:
http://geekswithblogs.net/casualjim/archive/2005/12/01/61722.aspx
la source
D'après ma réponse à une question similaire . Fonctionne mieux que certains des autres mentionnés car ils avaient quelques bogues (tels que ne pas prendre en charge le nom d'utilisateur / mot de passe, ne pas prendre en charge les noms de fichiers à un seul caractère, les identifiants de fragment étant cassés).
la source
Vous pouvez obtenir tous les http / https, hôte, port, chemin ainsi que la requête en utilisant l'objet Uri dans .NET. juste la tâche difficile est de diviser l'hôte en sous-domaine, nom de domaine et TLD.
Il n'y a pas de norme pour le faire et ne peut pas être simplement utiliser l'analyse de chaîne ou RegEx pour produire le résultat correct. Au début, j'utilise la fonction RegEx mais toutes les URL ne peuvent pas analyser correctement le sous-domaine. La méthode pratique consiste à utiliser une liste de TLD. Après la définition d'un TLD pour une URL, la partie gauche est le domaine et le reste est le sous-domaine.
Cependant, la liste doit la maintenir car de nouveaux TLD sont possibles. Le moment actuel que je connais est que publicuffix.org maintient la dernière liste et vous pouvez utiliser les outils d'analyse de nom de domaine du code google pour analyser la liste des suffixes publics et obtenir facilement le sous-domaine, le domaine et le TLD en utilisant l'objet DomainName: domainName.SubDomain, domainName .Domain et domainName.TLD.
Cette réponse est également utile: obtenir le sous-domaine à partir d'une URL
CaLLMeLaNN
la source
En voici un qui est complet et qui ne repose sur aucun protocole.
Tirages
la source
Aucune de ces réponses n'a fonctionné pour moi. Voici ce que j'ai fini par utiliser:
la source
J'aime le regex qui a été publié dans "Javascript: The Good Parts". Ce n'est ni trop court ni trop complexe. Cette page sur github contient également le code JavaScript qui l'utilise. Mais il peut être adapté à n'importe quelle langue. https://gist.github.com/voodooGQ/4057330
la source
Java propose une classe d'URL qui fera cela. Objets d'URL de requête.
Par ailleurs, PHP propose parse_url () .
la source
Je recommanderais de ne pas utiliser de regex. Un appel API tel que WinHttpCrackUrl () est moins sujet aux erreurs.
http://msdn.microsoft.com/en-us/library/aa384092%28VS.85%29.aspx
la source
J'ai essayé quelques-uns d'entre eux qui ne couvraient pas mes besoins, en particulier le vote le plus élevé qui n'a pas attrapé une URL sans chemin ( http://example.com/ )
aussi le manque de noms de groupe l'a rendu inutilisable dans ansible (ou peut-être que mes compétences en jinja2 font défaut).
c'est donc ma version légèrement modifiée avec la source étant la version la plus votée ici:
la source
L'utilisation de http://www.fileformat.info/tool/regex.htm regex de hometoast fonctionne très bien.
Mais voici l'affaire, je veux utiliser différents modèles de regex dans différentes situations dans mon programme.
Par exemple, j'ai cette URL et j'ai une énumération qui répertorie toutes les URL prises en charge dans mon programme. Chaque objet de l'énumération a une méthode getRegexPattern qui renvoie le modèle regex qui sera ensuite utilisé pour comparer avec une URL. Si le modèle d'expression régulière particulier renvoie vrai, alors je sais que cette URL est prise en charge par mon programme. Ainsi, chaque énumération a sa propre expression régulière en fonction de l'endroit où elle doit regarder dans l'URL.
La suggestion de Hometoast est excellente, mais dans mon cas, je pense que cela n'aiderait pas (à moins que je copie-collez le même regex dans toutes les énumérations).
C'est pourquoi je voulais que la réponse donne le regex pour chaque situation séparément. Bien que +1 pour hometoast. ;)
la source
Je sais que vous prétendez être indépendant du langage à ce sujet, mais pouvez-vous nous dire ce que vous utilisez juste pour que nous sachions quelles fonctionnalités regex vous avez?
Si vous avez la possibilité de ne pas capturer des correspondances, vous pouvez modifier l'expression de hometoast afin que les sous-expressions que vous ne souhaitez pas capturer soient configurées comme ceci:
(?:SOMESTUFF)
Vous devrez toujours copier et coller (et modifier légèrement) l'expression régulière à plusieurs endroits, mais cela a du sens - vous ne vérifiez pas seulement si la sous-expression existe, mais plutôt si elle existe dans le cadre d'une URL . L'utilisation du modificateur non capturant pour les sous-expressions peut vous donner ce dont vous avez besoin et rien de plus, ce qui, si je vous lis correctement, est ce que vous voulez.
Tout comme une petite, petite note, l'expression de hometoast n'a pas besoin de mettre entre crochets le «s» pour «https», car il n'a qu'un seul caractère. Les quantificateurs quantifient le caractère (ou la classe de caractères ou la sous-expression) qui les précède directement. Alors:
https?
correspondrait parfaitement à «http» ou «https».
la source
regexp pour obtenir le chemin de l'URL sans le fichier.
url = ' http: // domaine / dir1 / dir2 / un fichier ' url.scan (/ ^ (http: // [^ /] +) ((?: / [^ /] +) + (? = /)) ? /? (?: [^ /] +)? $ / i) .to_s
Cela peut être utile pour ajouter un chemin relatif à cette URL.
la source
Le regex pour faire une analyse complète est assez horrible. J'ai inclus des références arrière nommées pour la lisibilité et j'ai divisé chaque partie en lignes séparées, mais cela ressemble toujours à ceci:
La chose qui exige qu'elle soit si verbeuse est qu'à l'exception du protocole ou du port, n'importe laquelle des parties peut contenir des entités HTML, ce qui rend la délimitation du fragment assez délicate. Ainsi, dans les derniers cas - l'hôte, le chemin, le fichier, la chaîne de requête et le fragment, nous autorisons soit toute entité html, soit tout caractère qui n'est pas un
?
ou#
. Le regex pour une entité html ressemble à ceci:Quand cela est extrait (j'ai utilisé une syntaxe de moustache pour le représenter), cela devient un peu plus lisible:
En JavaScript, bien sûr, vous ne pouvez pas utiliser de références arrière nommées, donc l'expression régulière devient
et dans chaque correspondance, le protocole est
\1
, l'hôte est\2
, le port est\3
, le chemin\4
, le fichier\5
, la chaîne de requête\6
et le fragment\7
.la source
la source
J'ai essayé cette expression régulière pour analyser les partitions d'URL:
URL:
https://www.google.com/my/path/sample/asd-dsa/this?key1=value1&key2=value2
Allumettes:
la source
Fournira la sortie suivante:
1: https: //
2: www.thomas-bayer.com
3: /
4: axis2 / services / BLZService? Wsdl
Si vous modifiez l'URL en
String s = " https: //www.thomas -bayer.com?wsdl=qwerwer&ttt=888 "; la sortie sera la suivante:
1: https: //
2: www.thomas-bayer.com
3 :?
4: wsdl = qwerwer & ttt = 888
profiter ..
Yosi Lev
la source