2012-06-26 12 views
6

So che questo è stato chiesto migliaia di volte prima (scuse), ma cercando SO/Google ecc. Devo ancora ottenere una risposta definitiva.Javascript: estrae URL da string (inc. Querystring) e restituisce array

Fondamentalmente, ho bisogno di una funzione JS che quando viene passata una stringa, identifica & estrae tutti gli URL in base a un'espressione regolare, restituendo un array di tutti i trovati. ad esempio:

function findUrls(searchText){ 
    var regex=??? 
    result= searchText.match(regex); 
    if(result){return result;}else{return false;} 
} 

La funzione deve essere in grado di rilevare e restituire eventuali potenziali URL. Sono consapevole delle difficoltà intrinseche/emette con questo (parentesi chiusa ecc.), Quindi ho la sensazione che il processo debba essere:

Dividere la stringa (searchText) in sezioni distinte di inizio/fine) con nessuno dei due, un spazio o carrello restituiscono entrambi i lati di esso, risultando in blocchi di contenuto distinti, ad es fare una divisione.

Per ogni porzione di contenuto risultante dalla divisione, vedere se si adatta alla logica per un URL di qualsiasi costruzione, vale a dire, contiene un periodo immediatamente seguito il testo (l'unica regola costante per qualificare un potenziale URL).

L'espressione regolare deve verificare se il punto è immediatamente seguito da altro testo, del tipo consentito per una stringa di query tld, della struttura di directory & e preceduto dal testo del tipo consentito per un URL.

Sono consapevole che potrebbero verificarsi falsi positivi, tuttavia tutti i valori restituiti verranno quindi verificati con una chiamata all'URL stesso, quindi questo può essere ignorato. Le altre funzioni che ho trovato spesso non restituiscono anche la stringa di query degli URL, se presente.

Da un blocco di testo, la funzione dovrebbe quindi essere in grado di restituire qualsiasi tipo di URL, anche se ciò significa identificare will.i.am come valido!

es. http://www.google.com, google.com, www.google.com, http://google.com, ftp.google.com, https: // etc ... e qualsiasi derivazione di esso con una stringa di query dovrebbe essere restituito ...

molte grazie, le scuse di nuovo se questo esiste altrove sul SO ma le mie ricerche havent restituito ..

+0

Eventuali duplicati: http://stackoverflow.com/questions/1986121/match-all-urls-in-string-and-return-in- array-in-javascript – fonini

+1

Le persone dovrebbero interrompere il prefisso della variabile JS con '$' ... JS non è PHP! – helpermethod

+0

Scusate, è stato rimosso il mio capo in PHP tutto il giorno! – SW4

risposta

17

mi basta usare URI.js - rende facile.

var source = "Hello www.example.com,\n" 
    + "http://google.com is a search engine, like http://www.bing.com\n" 
    + "http://exämple.org/foo.html?baz=la#bumm is an IDN URL,\n" 
    + "http://123.123.123.123/foo.html is IPv4 and " 
    + "http://fe80:0000:0000:0000:0204:61ff:fe9d:f156/foobar.html is IPv6.\n" 
    + "links can also be in parens (http://example.org) " 
    + "or quotes »http://example.org«."; 

var result = URI.withinString(source, function(url) { 
    return "<a>" + url + "</a>"; 
}); 

/* result is: 
Hello <a>www.example.com</a>, 
<a>http://google.com</a> is a search engine, like <a>http://www.bing.com</a> 
<a>http://exämple.org/foo.html?baz=la#bumm</a> is an IDN URL, 
<a>http://123.123.123.123/foo.html</a> is IPv4 and <a>http://fe80:0000:0000:0000:0204:61ff:fe9d:f156/foobar.html</a> is IPv6. 
links can also be in parens (<a>http://example.org</a>) or quotes »<a>http://example.org</a>«. 
*/ 
12

si potrebbe usare l'espressione regolare da URI.js:

// gruber revised expression - http://rodneyrehm.de/t/url-regex.html 
var uri_pattern = /\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`!()\[\]{};:'".,<>?«»“”‘’]))/ig; 

String#match eo String#replace può aiutare ...

+0

Grazie, ma questo doesnt sembrano identificare, ad esempio: 'google.com' – SW4

+0

noti che usare una regex - questo in particolare - può causare problemi ("backtracking catastrofico") - https://github.com/medialize/URI.js/issues/131 - mi piacerebbe andare con la risposta di @ Chovy e utilizzare URI.withinString() – rodneyrehm