php preg_match查找<img>标记,但没有gif扩展名



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

我现在有这个:

  $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
  $pattern = "/<img[^>]+>/i";
  preg_match($pattern, $text, $matches);
  $text = $matches[0];

$text会给我第一个标签,例如<img src="something.gif" border="0" />但是,我不想接受.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 = '/<imgs+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'];
?>

最新更新