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.
C'est celui que j'utilise
(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?
Ça marche pour moi, ça devrait aussi marcher pour vous.
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:
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-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'
]
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
(?<![.,?!-])
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);
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*)
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.
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`!()\[\]{};:'".,<>?«»“”‘’]))?
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, ...
Court et simple. Je n'ai pas encore testé le code javascript mais il semble que ça va marcher:
((http|ftp|https):\/\/)?(([\w.-]*)\.([\w]*))
Dans le cas où quelqu'un aurait besoin de regex pour détecter des URL comme celles-ci:
Je suis venu avec cette regex:
((http(s)?://)?([\w-]+\.)+[\w-]+[.com]+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)
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*)?/
C'est le plus simple. ce qui fonctionne pour moi bien.
%(http|ftp|https|www)(://|\.)[A-Za-z0-9-_\.]*(\.)[a-z]*%
J'ai utilisé ceci
^(https?:\\/\\/([a-zA-z0-9]+)(\\.[a-zA-z0-9]+)(\\.[a-zA-z0-9\\/\\=\\-\\_\\?]+)?)$
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:
file:
et localhost
ainsi que les adresses IP#
ou -
(voir l'URL de ce post)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
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
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\-\.,@?^=%&:/~\+#]*[A-Z\-\@?^=%&/~\+#]){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.