Javascript: извлечение URL-адресов из string (inc. querystring) и возвращаемый массив


Я знаю, что это было задано тысячу раз раньше (извинения), но поиск SO/Google и т. д. Я еще не получил окончательного ответа.

В принципе, мне нужна функция JS, которая при передаче строки идентифицирует и извлекает все URL-адреса на основе регулярного выражения, возвращая массив всех найденных. например:

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

Функция должна быть способна обнаруживать и возвращать любые потенциальные URL-адреса. Я знаю о врожденных трудностях / иссах с этим (закрывающие скобки и т. д.), Поэтому у меня есть ощущение процесса должно быть:

Разбейте строку (searchText) на отдельные разделы, начинающиеся/заканчивающиеся) либо ничем, пробелом или возвратом каретки с любой стороны от нее, что приведет к различным фрагментам содержимого, например, выполните разбиение.

Для каждого фрагмента содержимого, полученного в результате разбиения, посмотрите, соответствует ли он логике для URL любой конструкции, а именно, содержит ли он точку, непосредственно следующую за текстом (одно постоянное правило для квалификации потенциального URL).

Регулярное выражение должно видеть, является ли за точкой сразу же следует другой текст, допустимого типа для дву, структуры каталогов и строки запроса,а перед ним-текст допустимого типа для URL.

Я знаю, что могут возникнуть ложные срабатывания, однако любые возвращенные значения будут проверены с помощью вызова самого URL-адреса, поэтому это может быть проигнорировано. Другие функции, которые я нашел, часто не возвращают строку запроса url, если она присутствует.

Из блока текста функция, таким образом, должна быть способна возвращать любой тип URL, даже если это означает идентификацию will.i.am как действительный!

Напр. http://www.google.com , google.com, www.google.com, http://google.com , ftp.google.com протокол HTTPS:// и т. д...и любое их производное с помощью строки запроса его надо вернуть...

Большое спасибо, еще раз приношу извинения, если это существует в другом месте на SO, но мои поиски не вернули его..

3 6

3 ответа:

Я просто использую URI.js-делает это легко.

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>«.
*/

Можно использовать регулярное выражение из 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;

Строка # match и или строка#replace может помочь...

Попробуйте это

var expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi;

Вы можете использовать этот сайт для тестирования регулярных выражений http://gskinner.com/RegExr/