Извлечение 1 или более гиперссылок из текста абзаца в Javascript с использованием регулярных выражений - PullRequest
0 голосов
/ 20 января 2010

Извините, что беспокою вас, ребята, но вот моя дилемма.

Должно быть «лучшее» регулярное выражение для идентификации HTML-ссылки из текста абзаца (в тексте может быть более 1 HTML-ссылки). Как извлечь всю ссылку и закрепить ее в javascript?

Моя попытка (в javascript) выглядит так:

var urlPattern = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?";

function extractURLs(s) {
    return s.match(new RegExp(urlPattern));
}

//s is of type String

//For testing...
var text = "Check this video out http://ww w.youtube.com/watch?v=y3U3R3b1dOg or http://www.youtube.com/watch?v=sX6Vm0MoPCY";
alert(extractURLs(text));

(пробелы в гиперссылке были намеренно добавлены здесь, чтобы разрешить размещение вопроса в SO). Результат: я получаю только 1-ю гиперссылку, а не вторую .... Кто-нибудь сделал что-то подобное или лучше, что я могу использовать?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 20 января 2010

Используйте модификатор "g":

function extractURLs(s) {
    return s.match(new RegExp(urlPattern, "g"));
}
0 голосов
/ 20 января 2010

Лучше написать как,

var urlPattern = /(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?/g;

function extractURLs(s) {
    return s.match(urlPattern);
}

Здесь urlPattern предварительно компилируется, а не компилируется в RegEx при каждом вызове функции, следовательно, это приводит к повышению производительности.

0 голосов
/ 20 января 2010
var urlPattern = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?";


function extractURLs(s) {
    return s.match(new RegExp(urlPattern));
}

var text = "Check this video out http://www.youtube.com/watch?v=y3U3R3b1dOg or http://www.youtube.com/watch?v=sX6Vm0MoPCY";
var results = extractURLs(text);

alert(extractURLs(results[0]  + ", " + results[1])); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...