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

У меня есть текст и шаблон регулярного выражения

текст что-то вроде

foo https://www.google.hu <img ... src="http://a-page.com/foobar.jpg" ...> bar

регулярное выражение

/(http|https|ftp)\:\/\/(www\.)?([a-zA-Z0-9\-\_\.]+)\.([a-z]{1,5}+)\/([a-zA-Z0-9\.\?\=\&\-\_\~\/\%\+\;]+)?(\#([a-zA-Z0-9\_]+))?/i

и я бы обновил его специальным случаем

если URL-адрес начинается с src=", было бы здорово, если бы совпадения регулярных выражений не содержали URL-адрес изображения, а только другие URL-адреса

я пробовал это

/(?!src\=\")(http|https|ftp)\:\/\/(www\.)?([a-zA-Z0-9\-\_\.]+)\.([a-z]{1,5}+)\/([a-zA-Z0-9\.\?\=\&\-\_\~\/\%\+\;]+)?(\#([a-zA-Z0-9\_]+))?/

но это не работает

Не могли бы вы мне помочь, пожалуйста?

Я знаю, что могу добавить (^|\s) к шаблону, но это не сработает в случае, если я хочу скрыть URL-адреса, потому что пользователь может написать любой символ перед URL-адресом, и URL-адрес больше не скрыт, а некоторые другие коды регулярных выражений находятся в источник тоже, и один из них является кодом тега img bb, и я не хочу скрывать (заменять) его URL-адрес

(Извините за мой английский)


person Community    schedule 03.10.2013    source источник
comment
Почему ты убегаешь от всех этих чар? Regex будет понятнее, если вы экранируете только те, которые необходимы.   -  person Toto    schedule 04.10.2013


Ответы (1)


Честно говоря, мне было трудно понять, что именно вы хотите, но я думаю, вы имеете в виду, что у вас есть текст с различными URL-адресами внутри, и вы не хотите сопоставлять те, которые включены в тег html img. Если это так, попробуйте это:

/(?<!src\=\")(https?|ftp):\/\/(www\.)?([\w\-\.]+)\.([a-z]{1,5}+)\/?([\w\.\?\=\&\-\~\/\%\+\;]+)?(\#(\w+))?/

Примечания:

  • Вы можете заменить [A-Za-z0-9_] классом символов \w (подробнее читайте в perlre).
  • Утверждение (?!pattern), которое вы попробовали, является отрицательным утверждением упреждающего просмотра. В вашем случае вам нужен отрицательный look-behind (?<!pattern) (опять же вы можете прочитать perlre для получения дополнительной информации).
person psxls    schedule 04.10.2013
comment
+1 не пробовал ваш ответ (я считаю, что он работает), но ссылка на perlre и ваше наблюдение о просмотре назад были мне полезны. Спасибо. - person lepe; 11.12.2013