web-dev-qa-db-fra.com

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 les URL dans une chaîne? J'ai trouvé de nombreuses expressions régulières sur Google pour déterminer si une chaîne entière est une URL, mais je dois pouvoir rechercher des URL dans une chaîne entière. Par exemple, j'aimerais 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 recherche TOUTES les URL de la chaîne, raison pour laquelle j'ai besoin d'une expression régulière.

62
user758263

C'est celui que j'utilise 

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

Ça marche pour moi, ça devrait aussi marcher pour vous.

161
Rajeev

Je suppose qu’aucune expression rationnelle n’est parfaite pour cet usage. 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 postés ici:

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

Voir ici pour des exemples

23
Stefan Henze
text = """The link of this question: https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-string
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-string', 
    'www.google.com', 
    'facebook.com',
    'http://test.com/method?param=wasd'
]
9
GooDeeJaY

Aucune des solutions fournies ici n'a résolu les problèmes/cas d'utilisation que j'avais.

Ce que j'ai fourni ici, est le meilleur que j'ai trouvé/fait jusqu'à présent. Je le mettrai à jour lorsque je trouverai de nouveaux cas Edge qu’il ne gère pas.

\b
  #Word cannot begin with special characters
  (?<![@.,%&#-])
  #Protocols are optional, but take them with us if they are present
  (?<protocol>\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
  (\.([a-z]{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
(?<![.,?!-])
5
Squazz

Je pense que ce motif de regex gère exactement 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 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-string to filter goes here.";

// Check if there is a url in the text
preg_match_all($reg_exUrl, $text, $url,$matches);
var_dump($matches);
4
Yusef Mohamadi

Toutes les réponses ci-dessus ne correspondent pas aux caractères Unicode de 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*)
3
Duc Filan

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

2
manojlds

J'ai trouvé this qui couvre la plupart des exemples de liens, y compris les sous-répertoires.

Regex est:

(?:(?:https?|ftp):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))?
1
Thilanka Bowala

J'utilise cette regex:

/((\w+:\/\/\S+)|(\w+[\.:]\w+\S+))[^\s,\.]/ig

Cela fonctionne bien pour plusieurs URL, telles que: http://google.com , https://dev-site.io:8080/home?val=1&count=100 , www. regexr.com, localhost: 8080/path, ...

0
Sillas Camara

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

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

Code sur regex101.com

 Code preview

0
bafsar

Dans le cas où quelqu'un aurait besoin de regex pour détecter des URL comme celles-ci:

  1. https://www.youtube.com/watch?v=38XmKNcgjSU
  2. https://www.youtube.com/
  3. www.youtube.com
  4. youtube.com ...

Je suis venu avec cette regex:

((http(s)?://)?([\w-]+\.)+[\w-]+[.com]+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)
0
Dragana Le Mitova

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

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

C'est le plus simple. ce qui fonctionne pour moi bien.

%(http|ftp|https|www)(://|\.)[A-Za-z0-9-_\.]*(\.)[a-z]*%
0
Md. Miraj Khan

J'ai utilisé ceci

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

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

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

Je l'ai testé sur Python et tant que l'analyse des chaînes contient un espace avant et après et aucune dans l'URL (que je n'ai jamais vue auparavant), tout devrait bien se passer.

Voici une idée en ligne pour le démontrer

Cependant, voici quelques avantages à l'utiliser: 

  • Il reconnaît file: et localhost ainsi que les adresses IP
  • Jamais ne correspondra pas sans eux
  • Cela ne dérange pas les caractères inhabituels tels que # ou - (voir l'URL de ce post)
0
Simon

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

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

Pour plus d'infos, lisez ceci:

Un modèle de regex précis et libéral amélioré pour la correspondance des URL

0
Tommaso Belluzzo

L'utilisation de l'expression régulière fournie par @JustinLevene n'a pas eu les séquences d'échappement appropriées sur les barres obliques inversées. Mis à jour pour être maintenant correct, et ajouté dans la condition pour correspondre également au protocole FTP: Correspond à toutes les URL avec ou sans protocoles, et sans sans "www." 

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

Exemple: https://regex101.com/r/uQ9aL4/65

0
Justin E. Samuels

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

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

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

Je me suis débarrassé du chèque de "http", etc., car je voulais attraper une URL sans cela. J'ai légèrement ajouté à la regex pour attraper des URL obscurcies (c'est-à-dire où l'utilisateur utilise [point] au lieu d'un "."). Finalement, j'ai remplacé "\ w" par "A-Z" et "{2,3}" pour réduire les faux positifs comme v2.0 et "moo.0dd".

Toute amélioration sur cet accueil.

0
avjaarsveld