2014-10-13 5 views
3

У меня есть текст формы, где есть абзацы текста с URL-адресами. Я хотел бы разобрать строку создания HTML ссылки из URL-адресов и используя следующий текст в качестве описательного текста ссылки т.е.Javascript Regex: match text after pattern

possibly some text here http://www.somewebsite.com/some/path/somepage.html descriptive text which may or may not be present 

в

<a href="http://www.somewebsite.com/some/path/somepage.html">descriptive text which may or may not be present</a> 

Это SO статьи, JS: Find URLs in Text, Make Links, имеет отношение к тому, что Я пытаюсь сделать, но просто помещает url как текст внутри элемента привязки.

Я успешно соответствуя URL с

var urlRE= new RegExp("([a-zA-Z0-9]+://)?([a-zA-Z0-9_]+:[a-zA-Z0-9_][email protected])?([a-zA-Z0-9.-]+\\.[A-Za-z]{2,4})(:[0-9]+)?([^ ])+"); 

, но не уверен, как выполнить матч впоследствии.

Я наткнулся на это сообщение Regex - Matching text AFTER certain characters который кажется применимым. Я попытался обернуть свой RE в /(?<=my url pattern here).+/, но получить сообщение об ошибке, что есть недопустимая группа, и это приводит к недействительной RE.

В этой должности J-Law упоминает, что

переменной длина не просмотр назад допускается

Это то, что я пытаюсь сделать?

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

Я просто использую это как попытку узнать больше о регулярном выражении.

Благодаря

+2

FYI не только переменные длины не допускаются в большинстве вариантов регулярных выражений * (.NET является исключением из правила здесь) *, JavaScript не поддерживает lookbehinds * вообще *. –

+0

Заметка о вашем регулярном выражении. У него есть требование, чтобы после домена не было пробела. '([^]) +'. Если есть такая вещь, как 'site.XX', она не будет соответствовать. Вы можете изменить его на '([^]) *, и я не думаю, что это будет иметь большое значение. – sln

ответ

4

Просто добавьте еще одну группу захвата, чтобы захватить все вещи в конце и сделать ваше внутреннее группам не-захвата. Что-то вроде:

var urlRE= new RegExp("((?:[a-zA-Z0-9]+://)?(?:[a-zA-Z0-9_]+:[a-zA-Z0-9_][email protected])?(?:[a-zA-Z0-9.-]+\\.[A-Za-z]{2,4})(?::[0-9]+)?(?:[^ ])+)(.*)$"); 
 

 
    var s = "possibly some text here http://www.somewebsite.com/some/path/somepage.html descriptive text which may or may not be present" 
 
    
 
    var match = urlRE.exec(s); 
 
    alert(match[0] + "\n\n" + match[1] + "\n\n" + match[2]); 
 

 
    // Returns: 
 
    // ["http://www.somewebsite.com/some/path/somepage.html descriptive text which may or may not be present", 
 
    // "http://www.somewebsite.com/some/path/somepage.html", 
 
    // " descriptive text which may or may not be present"]

Я завернул все регулярное выражение в скобках (), чтобы сформировать первую группу захвата, так и внутри, что я сделал все существующие группы, не захватив с ?:, Вы не совсем необходимо сделать это (делая их не захватывающими), но это упрощает вывод. Затем я добавил еще одну группу (.*), чтобы захватить все остальное до конца строки $.

После .exec, если у вас есть матч, ваш матч будет в [0], URL-адрес часть будет в [1] и остальной части текста в [2]. Вот почему мы использовали группы, не связанные с захватом, потому что в противном случае у вас будет куча других захватов, которые могут или не могут быть полезными.