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

Также добавлены безопасные спички как предложено в комментарии.

Другие вопросы по тегам