Espressione regolare per trovare gli URL all’interno di una stringa

Qualcuno sa dell’espressione regolare che potrei usare per trovare gli URL all’interno di una stringa? Ho trovato molte espressioni regolari su Google per determinare se un’intera stringa è un URL, ma devo essere in grado di cercare un’intera stringa per gli URL. Ad esempio, vorrei poter trovare www.google.com e http://yahoo.com nella seguente stringa:

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

Non sto cercando URL specifici nella stringa. Sto cercando TUTTI gli URL nella stringa, motivo per cui ho bisogno di un’espressione regolare.

Questo è quello che uso

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

Funziona per me, dovrebbe funzionare anche per te.

Indovina no regex è perfetto per questo uso. Ne ho trovato uno piuttosto solido qui

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

Alcune differenze / vantaggi rispetto agli altri pubblicati qui:

  • Non corrisponde agli indirizzi email
  • Abbina localhost: 12345
  • Non rileverà qualcosa come moo.com senza http o www

Vedi qui per gli esempi

 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) 

Produzione:

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

Nessuna delle soluzioni fornite qui ha risolto i problemi / casi d’uso che avevo.

Quello che ho fornito qui è il migliore che ho trovato / fatto finora. Lo aggiornerò quando troverò nuovi edge case che non gestisce.

 \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 (? 

Se hai lo schema URL, dovresti riuscire a cercarlo nella tua stringa. Assicurati che il pattern non abbia ^ e $ segnano l’inizio e la fine della stringa dell’URL. Quindi se P è il modello per l’URL, cerca le corrispondenze per P.

Tutte le risposte di cui sopra non corrispondono ai caratteri Unicode nell’URL, ad esempio: http://google.com?query=đức+filan+đã+search

Per la soluzione, questo dovrebbe funzionare:

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

Penso che questo pattern regex gestisca esattamente quello che vuoi

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

e questo è un esempio di snippet per estrarre 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); 

Questo è un leggero miglioramento / adattamento a (a seconda di cosa hai bisogno) la risposta di Rajeev:

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

Vedi qui per un esempio di ciò che fa e non corrisponde.

Mi sono liberato dell’assegno per “http” ecc. Perché volevo prendere url senza questo. Ho aggiunto leggermente alla regex per catturare alcuni URL offuscati (cioè dove l’utente usa [punto] invece di un “.”). Alla fine ho sostituito “\ w” con “AZ” e “{2,3}” per ridurre i falsi positivi come v2.0 e “moo.0dd”.

Qualsiasi miglioramento in questa accoglienza.

Breve e semplice Non ho ancora provato il codice javascript ma sembra che funzionerà:

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

Codice su regex101.com

Anteprima del codice

Se devi essere severo nel selezionare i link, vorrei andare a:

 (?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`!()\[\]{};:'".,<>?«»“”''])) 

Per maggiori informazioni, leggi questo:

Un modello regex liberale e accurato migliorato per gli URL di corrispondenza

L’ho usato

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

Un metodo probabilmente troppo semplicistico, ma potrebbe essere:

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

L’ho provato su Python e fintanto che l’analisi delle stringhe contiene uno spazio prima e dopo e nessuno nell’URL (che non ho mai visto prima) dovrebbe andare bene.

Ecco un ide online che lo dimostra

Tuttavia ecco alcuni vantaggi nell’utilizzarlo:

  • Riconosce file: localhost e indirizzi IP
  • Non si accoppierà mai senza di loro
  • Non importa personaggi insoliti come # o - (vedi l’url di questo post)

Ho usato sotto l’espressione regolare per trovare l’url in una stringa:

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

Questo è il più semplice che funziona per me bene.

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

Io uso la logica di trovare il testo tra due punti o punti

la regex di seguito funziona bene con python

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

Questo è il migliore.

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

La corrispondenza di un URL in un testo non dovrebbe essere così complessa

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

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

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

Anche questo funziona bene nel tuo caso.