要查找的php预匹配<;img>;标记,但不带gif扩展名

要查找的php预匹配<;img>;标记,但不带gif扩展名,php,regex,preg-match,Php,Regex,Preg Match,我知道如何在字符串中查找img标记,但我需要排除任何带有gif扩展名的img标记。如何在赛前使用负片?我只需要第一个不包含.gif扩展名的图像标签 我目前有: $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8'); $pattern = "/<img[^>]+\>/i"; preg_match($pattern, $text, $matches); $text = $matches[0]; $text=h

我知道如何在字符串中查找img标记,但我需要排除任何带有gif扩展名的img标记。如何在赛前使用负片?我只需要第一个不包含.gif扩展名的图像标签

我目前有:

  $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
  $pattern = "/<img[^>]+\>/i";
  preg_match($pattern, $text, $matches);
  $text = $matches[0];
$text=html\u entity\u decode($text,ENT\u引号,'UTF-8');
$pattern=“///code>
但是,我不想接受.gif,因此如果第一个是gif,它将跳过它并继续搜索其他文件

请告诉我如何将代码更改为它


非常感谢!

不要这样做。尝试用正则表达式解析HTML是一项注定要失败的任务,因为HTML的复杂性或需求的轻微增加会使正则表达式变得难以置信的复杂

最好的方法是使用为任务设计的工具:
DOMDocument

$dom = new DOMDocument;
$dom->loadHTML($text);

$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
    if (!substr($image->getAttribute('src'), -4) === '.gif') {
        break;
    }
}

// $image is now the first image that didn't end with .gif

如果仍然要使用正则表达式,请尝试将模式更改为类似这样的内容

<?php
$text = '<img src="something.jpg" ';
$pattern = '/<img\s+src="(([^"]+)(.)(jpeg|png|jpg))"/';
preg_match_all($pattern, $text, $out);

echo '<pre>';
print_r($out);
?>

试试这个:

<?php
$text = '<img src="something.jpg" ';

preg_match('/src="(?P<image>.*\.(jpeg|png|jpg))"/', $text, $matches);

echo $matches['image'];
?>


那么
呢?这也是有道理的:),我的模式只是为了显示扩展名应该是白名单的。你的正则表达式将匹配
.gif
扩展名。谢谢你的建议。谈到domdocument,我能不能找到图像的宽度?假设我想排除.gif和任何图像宽度小于200px。我知道我可能可以使用getAttribute(“宽度”),但人们可能没有宽度属性,或者实际大小可能更大。有没有办法找到图像的实际宽度?@user2082532不使用图像库加载图像。