2016-07-28 4 views
3

Будучи нубом в регулярных выражениях я требую некоторой поддержки со стороны сообществарегулярного выражения, чтобы соответствовать всем ключевым словам в строке

Пусть у меня есть эта строка ули

  1. www.anysite.com привет демо попробуйте эту ссылку

  2. anysite.com действительно демонстрационная ссылка

  3. http://www.anysite.com еще один

  4. www.anysite.com

  5. http://anysite.com

Рассмотрим 1-5 в целом строка ул здесь

Я хочу, чтобы преобразовать все ' anysite.com 'в интерактивные ссылки html, для которых я использую:

str = str.replace(/((http|https|ftp):\/\/[\w?=&.\/-;#~%-]+(?![\w\s?&.\/;#~%"=-]*>))/g, '<a href="$1" target="_blank">$1</a>'); 

Это преобразует все пространство разделенных слов, начиная с HTTP/HTTPS/FTP в ссылки, как

<a href="url" target="_blank">url</a> 

Таким образом, линии и линии правильно преобразованы. Теперь, чтобы преобразовать все www.anysite.com в ссылки я снова использовал

str = str.replace(/(\b^(http|https|ftp)?(www\.)[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, '<a href="https://$1" target="_blank">$1</a>'); 

Хотя он преобразует только www.anysite.com в ссылку, если она находится в самом начале ул. Поэтому он преобразует номер строки , но не номер строки .

Обратите внимание, что я использовал ^? (HTTP | HTTPS | FTP) (. WWW), чтобы найти все WWW не начиная с HTTP/HTTPS/FTP, как и для HTTP они уже были преобразованы

Также ссылка на номер строки , где она не начинается с http или www, а заканчивается на .com, как для этого будет регулярное выражение.

Для справки вы можете попробовать разместить эту целую цепочку на вашей временной шкале facebook, она преобразует все пять строк в ссылки. Проверьте снимок

enter image description here

+0

Возможный дубликат [Что такое хорошее регулярное выражение для соответствия URL?] (Http://stackoverflow.com/questions/3809401/what-is-a-good-regular-expression-to-match-a- url) – nicael

+0

Возможно, вы использовали URL-адрес для регулярного выражения, и проблема была решена (вы уже знаете, как использовать замену, не так ли?) – nicael

+0

Пожалуйста, проверьте свой вопрос. –

ответ

0

^(http|https|ftp)?(www\.) не означает, что "все WWW не начиная с HTTP/HTTPS/FTP", а «строку, которая начинается с дополнительным http/https/ftp с последующим www..

Действительно, ^ в этот контекст не является отрицанием, а скорее якорем, представляющим начало строки.Я полагаю, вы использовали его таким образом из-за его значения при использовании в символьном классе ([^...]); это довольно сложно, поскольку его значение изменяется в зависимости от контекста, в котором он находится.

Вы можете просто удалить его, и все должно быть хорошо, поскольку я не вижу смысла следить за тем, чтобы строка не начиналась с http/https/ftp (вы преобразовали те появления непосредственно перед этим, не должно быть ни одного).


Edit: я уже забыл, но 'назад он не доступен в JS ...

Если вы хотите, чтобы сделать какой-то отрицание, проще всего было бы использовать отрицательное:' назад

(?<!http|https|ftp)www\. 

Это соответствует "www." только когда ему не предшествуют http, https и ftp.

+0

Он говорит «недопустимое выражение регулярного выражения», при проверке с помощью http://regexr.com/ он говорит: «Lookbehind не поддерживается в JavaScript – Anant

+0

Woops , правильно ... Не просто ли удаление '^' решить вашу проблему? потому что альтернативы не велики (либо используйте множественное регулярное выражение, чтобы проверить, что оно содержит «www ...», но не содержит «http [https | ftp»), или создайте ужасное регулярное выражение, которое соответствует каждым 5 или менее буквам, предшествующим " www ... ", которые не составляют http, https или ftp) – Aaron

+0

Вот что я пытался, но не смог сделать, хотя я все еще пытаюсь это сделать – Anant

3

Спасибо за помощь, окончательное RegEx, который помог мне это:

//remove all http:// and https:// 
str = str.replace(/(http|https):\/\//ig, ""); 

//replace all string ending with .com or .in only into link 
str = str.replace(/((www\.)?[[email protected]:%._\+~#=]{2,256}\.(com|in))/ig, '<a href="//$1" target="_blank">$1</a>'); 

Я .com и .в для моего конкретного требования, иначе решение по этому http://regexr.com/39i0i будет работать

Хотя на пороге есть проблема вроде: он не конвертирует укороченный URL в ссылки отлично. например, http://s.ly/qhdfTyuiOP даст ссылку до s.ly

Есть еще предложения?

Смежные вопросы