2012-06-26 5 views
6

Wiem, że zostało to zadane tysiąc razy wcześniej (przepraszam), ale szukając SO/Google itp. Mam jeszcze uzyskać rozstrzygającą odpowiedź.JavaScript: wyodrębnij adresy URL z ciągu znaków (w tym querystring) i zwróć tablicę

Zasadniczo potrzebuję funkcji JS, która po przekazaniu ciągu znaków identyfikuje & wyodrębnia wszystkie adresy URL na podstawie wyrażeń regularnych, zwracając tablicę wszystkich znalezionych. np .:

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

Funkcja powinna być w stanie wykryć i zwrócić wszystkie potencjalne adresy URL. Zdaję sobie sprawę z nierozwiązanych problemów z tym (zamknięcie nawiasów itp.), Więc mam wrażenie, że proces musi być:

Podziel ciąg (searchText) na różne sekcje rozpoczynające się/kończące) z nic albo spacja lub karetka powracają po jej obu stronach, co powoduje powstanie różnych fragmentów treści, np zrób split.

Dla każdego fragmentu treści, który wynika z podziału, sprawdź, czy pasuje on do logiki adresu URL dowolnej konstrukcji, a mianowicie czy zawiera kropkę bezpośrednio po tekście (jedna stała reguła dla kwalifikowania potencjalnego adresu URL).

W wyrażeniu regularnym należy sprawdzić, czy po kropce następuje bezpośrednio inny tekst, o typie dopuszczalnym dla ciągu znaków zapytania, oraz że jest on poprzedzony tekstem dopuszczalnego typu dla adresu URL.

Jestem świadomy fałszywych alarmów może wynik, jednak wszelkie zwracane wartości będą następnie sprawdzane z wywołaniem do samego adresu URL, więc można to zignorować. Inne funkcje, które znalazłem, często też nie zwracają ciągu zapytań adresów URL, jeśli są obecne.

Z bloku tekstu funkcja powinna mieć możliwość zwracania dowolnego typu adresu URL, nawet jeśli oznacza to identyfikację pliku will.i.am jako prawidłowego!

np. http://www.google.com, google.com, www.google.com, http://google.com, ftp.google.com, https: // etc ... oraz jego ewentualne wyprowadzenie z ciągiem zapytania powinny być zwrócone ...

Wielkie dzięki, przeprosiny ponownie jeśli istnieje gdzie indziej na SO ale moje wyszukiwania zwrócone miałaś go ..

+0

Możliwy duplikat: http://stackoverflow.com/questions/1986121/match-all-urls-in-string-and-return-in- array-in-javascript – fonini

+1

Ludzie powinni zatrzymać prefiksowanie zmiennej JS za pomocą '$ ... ... JS nie jest PHP! – helpermethod

+0

Przepraszam, miałem głowę w PHP cały dzień, usunie! – SW4

Odpowiedz

17

wystarczy użyć URI.js - ułatwia.

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

można użyć wyrażenia regularnego z 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 i lub String#replace może pomóc ...

+0

Dzięki, ale to nie wydaje się identyfikować, np .: "google.com" – SW4

+0

Pamiętaj, że użycie wyrażenia regularnego - w szczególności tego - może spowodować problemy ("katastroficzne cofnięcie") - https://github.com/medialize/URI.js/issues/131 - Poszedłbym z odpowiedzią @ chovy i użyłem URI.withinString() – rodneyrehm