Javascript: извлечь URL-адреса из строки (включая строку запроса) и вернуть массив

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

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

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

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

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

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

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

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

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

например. http://www.google.com, google.com, www.google.com, http://google.com, ftp.google.com, https: // и т. д. и любые их производные со строкой запроса должны быть вернулся ...

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


person SW4    schedule 26.06.2012    source источник
comment
Возможный дубликат: stackoverflow.com/questions/1986121/   -  person fonini    schedule 26.06.2012
comment
Люди должны прекратить префикс переменной JS с _1 _... JS - это не PHP!   -  person helpermethod    schedule 26.06.2012
comment
Извините - весь день сидел в PHP, удалим!   -  person SW4    schedule 26.06.2012
comment
Re: возможный дубликат, регулярное выражение в указанном вопросе не отвечает всем критериям, которые я изложил.   -  person SW4    schedule 27.06.2012
comment
Вы можете принять ответ?   -  person chovy    schedule 16.02.2015


Ответы (4)


Я просто использую 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>«.
*/
person chovy    schedule 07.09.2013

Вы можете использовать регулярное выражение из 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 и / или String # replace может помочь…

person rodneyrehm    schedule 26.06.2012
comment
Обратите внимание, что использование регулярного выражения, в частности этого, может вызвать проблемы (катастрофический откат) - github .com / medialize / URI.js / issues / 131 - я бы пошел с ответом @ chovy и использовал URI.withinString () - person rodneyrehm; 19.09.2014
comment
Регулярное выражение в этом ответе уязвимо для ReDoS из таких строк, как "[https://stackoverflow.com/questions/11209016/javascript-extract-urls-from-string-inc-querystring-and-return-array/11209098#11209098](https://stackoverflow.com/questions/11209016/javascript-extract-urls-from-string-inc-querystring-and-return-array/11209098#11209098)" - person Martijn Hols; 25.07.2018

Следующее регулярное выражение извлекает URL-адреса из строки (включая строку запроса) и возвращает массив

var url = "asdasdla hakjsdh aaskjdh https://www.google.com/search?q=add+a+element+to+dom+tree&oq=add+a+element+to+dom+tree&aqs=chrome..69i57.7462j1j1&sourceid=chrome&ie=UTF-8 askndajk nakjsdn aksjdnakjsdnkjsn";

var matches = strings.match(/\bhttps?::\/\/\S+/gi) || strings.match(/\bhttps?:\/\/\S+/gi);

Вывод:

["https://www.google.com/search?q=format+to+6+digir&…s=chrome..69i57.5983j1j1&sourceid=chrome&ie=UTF-8"]

Примечание. Это обрабатывает как http: // с одним двоеточием, так и http :: // с двойным двоеточием в строке, и наоборот для https, так что это безопасно для вас. :)

person Manoj Selvin    schedule 10.01.2019

попробуй это

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

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

person Naigel    schedule 26.06.2012