Intereting Posts
Проблема с подчеркиванием формата Как применить CSS и Styling к компоненту React Доступ к файлу входного типа на стороне сервера в asp.net Удлиненная шестиугольная кнопка, использующая только один элемент Лучший способ сделать разделение панели в html Как работать с различными разрешениями экрана в CSS? Прослушивание таких событий, как добавление новых элементов в JavaScript Как удалить элемент массива, хранящийся в локальном хранилище AJAX: Как заменить содержимое DIV ссылкой в ​​том же DIV? Как отобразить всплывающее окно datetime в строке таблицы Кросс-браузерный внутренний текст для установки значений не устанавливать фокус в текстовое поле в firefox как активировать текстовое поле, если я выберу другой вариант в раскрывающемся списке Как добавить изображение в InfoWindow маркера в google maps v3? Доступ к объекту документа кадра с помощью JavaScript

Regex сопоставляет изображения, но не внутри тега img

У меня есть функция, которая преобразует все внешние ссылки изображения в tags img в строке. Он работает хорошо, но также соответствует ссылкам внутри

например:

 $text = '

lorem ipsum http://https://stackoverflow.com/questions/20305942/regex-match-images-but-not-inside-img-tag/example.jpg

'; echo make_clickable($text); function make_clickable($text) { $replace = '

'; $text = preg_replace('~https?://[^/\s]+/\S+\.(jpg|png|gif)~i', $replace, $text ); return $text; }

этот тест будет совпадать как с обычным текстом, так и с src . это там способ исключить тег img ?

Вы можете использовать некоторую не известную силу регулярных выражений:

 ]*>(*SKIP)(*FAIL)|https?://[^/\s]+/\S+\.(?:jpg|png|gif) 

Давайте немного объясним шаблон:

 ]* # match anything except > zero or more times > # match a literal > (*SKIP)(*FAIL) # make it fail | # or https? # match http or https :// # match a literal :// [^/\s]+ # match anything except white-space and forward slash one or more times / # match a literal / \S+ # match a non-white-space one or more times \. # match a literal dot (?:jpe?g|png|gif) # match jpg, jpeg, png, gif # Don't forget to set the i modifier :) 

Идея состоит в том, чтобы сопоставить тег img и пропустить его, тем временем сопоставляя все эти URI.

Демо-версия

 $replace = '

'; $text = preg_replace('~(https?://[^/\s]+/\S+\.(jpg|png|gif))(?:\s|$|\n)~i', $replace, $text );

EDIT : ваше регулярное выражение не похоже на что-либо в моих тестах, но то, что я добавил в конце, это (?:\s|$|\n) . Надеюсь, вы поняли.