Expression régulière pour rechercher des URL dans une chaîne

Est-ce que quelqu’un connaît une expression régulière que je pourrais utiliser pour trouver des URL dans une chaîne? J’ai trouvé beaucoup d’expressions régulières sur Google pour déterminer si une chaîne entière est une URL, mais je dois pouvoir rechercher une chaîne entière pour les URL. Par exemple, je voudrais pouvoir trouver www.google.com et http://yahoo.com dans la chaîne suivante:

 Hello www.google.com World http://yahoo.com 

Je ne cherche pas d’URL spécifiques dans la chaîne. Je cherche TOUS les URL dans la chaîne, c’est pourquoi j’ai besoin d’une expression régulière.

C’est celui que j’utilise

 (http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])? 

Fonctionne pour moi, devrait travailler pour vous aussi.

Devinez pas de regex est parfait pour cette utilisation. J’ai trouvé un assez solide ici

 /(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$])/igm 

Quelques différences / avantages par rapport aux autres affichés ici:

  • Il ne correspond pas aux adresses e-mail
  • Il correspond à localhost: 12345
  • Il ne détectera pas quelque chose comme moo.com sans http ou www

Voir ici pour des exemples

 text = """The link of this question: https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-ssortingng Also there are some urls: www.google.com, facebook.com, http://test.com/method?param=wasd The code below catches all urls in text and returns urls in list.""" urls = re.findall('(?:(?:https?|ftp):\/\/)?[\w/\-?=%.]+\.[\w/\-?=%.]+', text) print(urls) 

Sortie:

 [ 'https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-ssortingng', 'www.google.com', 'facebook.com', 'http://test.com/method?param=wasd' ] 

Aucune des solutions proposées ici ne résout les problèmes / cas d’utilisation que j’ai rencontrés.

Ce que j’ai fourni ici est le meilleur que j’ai trouvé / réalisé jusqu’à présent. Je le mettrai à jour lorsque je trouverai de nouveaux boîtiers qu’il ne gère pas.

 \b #Word cannot begin with special characters (?\w{2,10}:\/\/)? #Domains have to be of a length of 1 chars or greater ((?:\w|\&\#\d{1,5};)[.-]?)+ #The domain ending has to be between 2 to 15 characters (\.([az]{2,15}) #If no domain ending we want a port, only if a protocol is specified |(?(protocol)(?:\:\d{1,6})|(?!))) \b #Word cannot end with @ (made to catch emails) (?![@]) #We accept any number of slugs, given we have a char after the slash (\/)? #If we have endings like ?=fds include the ending (?:([\w\d\?\-=#:%@&.;])+(?:\/(?:([\w\d\?\-=#:%@&;.])+))*)? #The last char cannot be one of these symbols .,?!,- exclude these (? 

Si vous avez le modèle url, vous devriez pouvoir le rechercher dans votre chaîne. Assurez-vous simplement que le motif n’a pas le début et la fin de la chaîne d’URL ^ et $ . Donc, si P est le motif de l’URL, recherchez les correspondances pour P.

Toutes les réponses ci-dessus ne correspondent pas aux caractères Unicode dans l’URL, par exemple: http://google.com?query=đức+filan+đã+search

Pour la solution, celle-ci devrait fonctionner:

 (ftp:\/\/|www\.|https?:\/\/){1}[a-zA-Z0-9u00a1-\uffff0-]{2,}\.[a-zA-Z0-9u00a1-\uffff0-]{2,}(\S*) 

Je pense que ce motif regex gère précisément ce que vous voulez

 /(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/ 

et ceci est un exemple d’extrait de code pour extraire les URL:

 // The Regular Expression filter $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/"; // The Text you want to filter for urls $text = "The text you want https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-ssortingng to filter goes here."; // Check if there is a url in the text preg_match_all($reg_exUrl, $text, $url,$matches); var_dump($matches); 

Ceci est une légère amélioration / ajustement de (selon ce dont vous avez besoin) la réponse de Rajeev:

 ([\w\-_]+(?:(?:\.|\s*\[dot\]\s*[AZ\-_]+)+))([AZ\-\.,@?^=%&:/~\+#]*[AZ\-\@?^=%&/~\+#]){2,6}? 

Voir ici pour un exemple de ce qu’il fait et ne correspond pas.

Je me suis débarrassé de la vérification pour “http”, car je voulais attraper les URL sans cela. J’ai ajouté un peu au regex pour attraper des URL obscurcies (c’est-à-dire où l’utilisateur utilise [point] au lieu d’un “.”). Enfin, j’ai remplacé “\ w” par “AZ” et “{2,3}” pour réduire les faux positifs comme v2.0 et “moo.0dd”.

Toute amélioration sur cet accueil.

Court et simple Je n’ai pas encore testé en code javascript mais il semble que ça va marcher:

 ((http|ftp|https):\/\/)?(([\w.-]*)\.([\w]*)) 

Code sur regex101.com

Aperçu du code

Si vous devez être ssortingct sur la sélection des liens, je choisirais:

 (?i)\b((?:[az][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”''])) 

Pour plus d’informations, lisez ceci:

Un modèle de regex libéral et précis amélioré pour les URL correspondantes

J’ai utilisé ça

 ^(https?:\\/\\/([a-zA-z0-9]+)(\\.[a-zA-z0-9]+)(\\.[a-zA-z0-9\\/\\=\\-\\_\\?]+)?)$ 

Une méthode probablement trop simpliste, mais fonctionnelle pourrait être:

 [localhost|http|https|ftp|file]+://[\w\S(\.|:|/)]+ 

Je l’ai testé sur Python et tant que l’parsing de chaîne contient un espace avant et après et aucun dans l’URL (que je n’ai jamais vu auparavant), ça devrait aller.

Voici un ide en ligne le démontrant

Cependant, voici quelques avantages à l’utiliser:

  • Il reconnaît les file: et localhost ainsi que les adresses IP
  • Il ne correspondra jamais sans eux
  • Cela ne dérange pas les caractères inhabituels tels que # ou - (voir l’URL de cet article)

J’ai utilisé ci-dessous une expression régulière pour trouver une URL dans une chaîne:

 /(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/ 

C’est le plus simple. qui fonctionne bien pour moi.

 %(http|ftp|https|www)(://|\.)[A-Za-z0-9-_\.]*(\.)[az]*% 

J’utilise la logique de la recherche de texte entre deux points ou périodes

le regex ci-dessous fonctionne bien avec python

 (?<=\.)[^}]*(?=\.) 

C’est le meilleur.

 NSSsortingng *urlRegex="(http|ftp|https|www|gopher|telnet|file)(://|.)([\\w_-]+(?:(?:\\.[\\w_-]+)‌​+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?"; 

Faire correspondre une URL dans un texte ne devrait pas être si complexe

(?:(?:(?:ftp|http)[s]*:\/\/|www\.)[^\.]+\.[^ \n]+)

https://regex101.com/r/wewpP1/2

Ssortingng regex = "[a-zA-Z0-9]+[.]([.a-zA-Z0-9])+";

Cela fonctionne bien dans votre cas aussi.