GIF код исключения Regex
У меня есть следующая функция, которая возвращает мне первое изображение поста:
$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i',
$post->post_content, $matches);
однако возвращает мне любое изображение, мне нужно игнорировать изображения в формате GIF, как я могу добавить это условие в выражении регулярного выражения?
3 ответа
Проще перебрать результаты и использовать другое регулярное выражение.
$output = preg_match_all('/<img[^>]+?src=[\'"](.+?)[\'"].*?>/i', $post->post_content, $matches);
foreach ($matches as $imgSrc)
{
if (!preg_match("/\.gif$/i"), $imgSrc)
{
$noGif[] = $imgSrc;
}
}
Это легче понять, и не будет неожиданных побочных эффектов, таких как блокировка допустимых изображений, которые, как оказалось, имеют букву "gif" в имени файла.
Обратите внимание, будьте очень осторожны при использовании .+
а также .*
, В настоящее время, ваше регулярное выражение соответствует гораздо больше, чем вы думаете:
Попробуйте это, например:
<img whatever> whatever <img src="mypic.png"> <some other tag>
Вы, вероятно, не должны использовать регулярные выражения
- HTML не обычный
- Регексы могут совпадать сегодня, но как насчет завтра?
Скажем, у вас есть файл HTML, в котором вы пытаетесь извлечь URL из тегов.
<img src="http://example.com/whatever.jpg">
Итак, вы пишете регулярное выражение, как это (на Perl):
if ( $html =~ /<img src="(.+)"/ ) {
$url = $1;
}
В этом случае $url действительно будет содержать http://example.com/whatever.jpg. Но что происходит, когда вы начинаете получать HTML, как это:
<img src='http://example.com/whatever.jpg'>
или же
<img src=http://example.com/whatever.jpg>
или же
<img border=0 src="http://example.com/whatever.jpg">
или же
<img
src="http://example.com/whatever.jpg">
или вы начинаете получать ложные срабатывания от
<!-- <img src="http://example.com/outdated.png"> -->
<img[^>]+src=[\'"](?:([^\'"](?!\.gif))+)[\'"][^>]*>
Обновлен, чтобы иметь только один захват.
Исправлено, чтобы включить точку. Теперь потерпит неудачу только на странных вещах, таких как a.gif.jpg
Также добавлены безопасные спички как предложено в комментарии.