web-dev-qa-db-fra.com

Expression régulière - Extraire le sous-domaine et le domaine

J'essaie de former une expression régulière (javascript/node.js) qui extraira la partie sous-domaine et domaine de n'importe quelle URL donnée. Voici ce que j'ai fini avec:

[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)

En ce moment, je considère juste http, https pour le protocole et exclure "www". partie de la partie sous-domaine + domaine d'une URL. J'ai vérifié l'expression et cela fonctionne presque. Mais, voici le problème:

Succès

'http://mplay.google.co.in/sadfask/asdkfals?dk=10'.match(/[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)/i)

'http://lplay.google.co.in/sadfask/asdkfals?dk=10'.match(/[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)/i)

Échec

'http://play.google.co.in/sadfask/asdkfals?dk=10'.match(/[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)/i)

'http://tplay.google.co.in/sadfask/asdkfals?dk=10'.match(/[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)/i)

J'utilise simplement le premier élément du tableau de résultats. Je ne peux pas comprendre pourquoi "jouer". & "tplay". ne fonctionne pas. Quelqu'un pourrait-il m'aider à cet égard?

"/ P" et "/ t" ont-ils une signification pour l'évaluateur d'expressions régulières?

Existe-t-il un autre moyen d'extraire le sous-domaine et le domaine d'une URL donnée à l'aide d'une expression régulière?

Modifier -

Exemple:

https://play.google.com/store/apps/details?id=com.skgames.trafficracer => play.google.com

https://mail.google.com/mail/u/0/#inbox => mail.google.com

17
sunilkumarba

Votre expression régulière ne semble pas correcte. Essayez cette expression régulière:

/^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n?]+)/img

Démo RegEx

54
anubhava

Vous êtes la millionième personne à avoir tenté d'analyser les URL en JavaScript. Je suis un peu surpris que vous n'ayez vu aucune des questions existantes sur SO datant de plusieurs années. La dernière chose que vous voulez faire est d'écrire une nouvelle expression rationnelle cassée, avec tout le respect que je vous dois. à ceux qui ont répondu à votre question.

Il existe de nombreuses bibliothèques et approches bien documentées pour gérer cela. Recherche le sur Google. Le moyen le plus simple consiste à créer un élément a en mémoire, à lui affecter un href, puis à accéder à ses hostname et à d'autres propriétés. Voir http://tutorialzine.com/2013/07/quick-tip-parse-urls/ . Si cela ne fait pas flotter votre bateau, utilisez une bibliothèque comme ri.j s.

Si vous ne voulez vraiment pas utiliser une bibliothèque et insistez pour réinventer la roue, faites au moins quelque chose comme ceci:

function get_domain_from_url(url) {
    var a = document.createElement('a').
    a.setAttribute('href', url);
    return a.hostname;
}

Essentiellement, vous déléguez l'extraction de la partie sous-domaine/domaine de l'URL à la logique d'analyse d'URL du navigateur, ce qui est BEAUCOUP mieux que tout ce que vous écrirez jamais.

Voir aussi Analyser l'URL avec jquery/javascript? , Analyser l'URL avec Javascript , Comment analyser une URL en nom d'hôte et chemin en javascript? , ou analyser l'URL avec JavaScript ou jQuery . Comment avez-vous raté cela? Désolé, je dois voter pour fermer ceci en double.

10
user663031

Le même RegExp que dans anubhava's réponse, prise en charge ajoutée uniquement pour RL relatives au protocole comme //google.com:

/^(?:https?:)?(?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)/im

Démo RegEx

6
Nicu Surdu

Voici une solution qui ignore tout avant ://

.*\://?([^\/]+)

Au cas où vous voudriez ignorer www.

.*\://(?:www.)?([^\/]+)
5
Ashoka Lella

Votre expression regex fonctionne plutôt bien. Il vous suffit de retirer les supports. L'expression finale est:

^(?:http:\/\/|www\.|https:\/\/)([^\/]+)

J'espère que c'est utile!

1
Academia