Исключение определенного шаблона из выражения регулярного выражения

Я провел последние пару дней, пытаясь понять, как решить эту проблему и опубликовать ее на SO, но до сих пор нет кубиков. Я думаю, что это, вероятно, легче, чем я делал, но мне нужна помощь;

Вот довольно простой оператор регулярного выражения, который связывает практически любую ссылку. Это не единственный шаблон регулярных выражений, который у меня есть, поэтому я включил часть, которая пропускает ссылку, если она содержит определенный шаблон «img.youtube.com/vi/». Он отлично работает;

$message = preg_replace("#(((f|ht)tp(s)?://)?!(img.youtube.com/vi/)[-a-zA-Z?-??-?()0-9@:%_+.~\#?&;//=,])+#i", "<a href=$1 target='_blank'><b>$1</b></a>", $message); 

Я не хочу, чтобы это связывало какой-либо url с .jpeg, jpg, gif или любым популярным форматом изображения, у меня есть другое выражение, которое будет вставлять эти типы ссылок (и это тоже отлично работает). Итак, мне нужно найти способ заставить это выражение отклонить эти типы ссылок.

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

Итак, в выражении regex выше уже есть пример строки, которая дисквалифицирует определенные URL-адреса -?! (Img.youtube.com/vi/). Кажется, это все, что мне нужно сделать, но где я могу это выразить и как это выглядит? Символ + в выражении делает это так, что регулярное выражение будет тщательно проверять строку до конца, используя соответствующие символы [-a-zA-Z? – ?? -? () 0-9 @: .?% _ + ~ # &; // =,]. Таким образом, эту совпадающую строку следует, вероятно, помещать где-то перед символом +. Это происходит в «?! (Img.youtube.com/vi/)»? На мой взгляд, это должно быть похоже на это;

 $message = preg_replace("#(((f|ht)tp(s)?://)?!(img.youtube.com/vi/|/^\.jpeg$/|/^\.jpg$/|/^\gif$/)[-a-zA-Z?-??-?()0-9@:%_+.~\#?&;//=,])+#i", "<a href=$1 target='_blank'><b>$1</b></a>", $message); 

Любая помощь приветствуется.

Я отвечаю, а также очищаю ваше регулярное выражение

 (?i)((?:f|ht)tps?://((?!img|jpe?g|gif|png|bmp))(?:([-a-z0-9()@:%_+.~#?&;/=,])(?2))+(?!(?3))) 

Теперь img т. Д., img вы не хотите, находится в негативном свете, и вы можете добавить то, что вам не нравится.

 $good="http://www.google.com/"; $bad="http://img.google.com/"; $r="#(?i)((?:f|ht)tps?://((?!img|jpe?g|gif|png|bmp))(?:([-a-z0-9()@:%_+.~\#?&;/=,])(?2))+(?!(?3)))#"; $rep="<a href=$1 target='_blank'><b>$1</b></a>"; echo preg_replace($r,$rep,$good); echo preg_replace($r,$rep,$bad); 3))) $good="http://www.google.com/"; $bad="http://img.google.com/"; $r="#(?i)((?:f|ht)tps?://((?!img|jpe?g|gif|png|bmp))(?:([-a-z0-9()@:%_+.~\#?&;/=,])(?2))+(?!(?3)))#"; $rep="<a href=$1 target='_blank'><b>$1</b></a>"; echo preg_replace($r,$rep,$good); echo preg_replace($r,$rep,$bad); 

Вы можете попробовать здесь http://ideone.com/419yfm

Просто удалите эту часть регулярного выражения:

 img| <?php $good="http://www.google.com/"; $bad="http://img.google.com/"; $r="#(?i)((?:f|ht)tps?://((?!jpe?g|gif|png|bmp))(?:([-a-z0-9()@:%_+.~\#?&;/=,])(?2))+(?!(?3)))#"; $rep="<a href=$1 target='_blank'><b>$1</b></a>"; echo preg_replace($r,$rep,$good); echo "\n"; echo preg_replace($r,$rep,$bad); ?> 3))) img| <?php $good="http://www.google.com/"; $bad="http://img.google.com/"; $r="#(?i)((?:f|ht)tps?://((?!jpe?g|gif|png|bmp))(?:([-a-z0-9()@:%_+.~\#?&;/=,])(?2))+(?!(?3)))#"; $rep="<a href=$1 target='_blank'><b>$1</b></a>"; echo preg_replace($r,$rep,$good); echo "\n"; echo preg_replace($r,$rep,$bad); ?> 

DEMO