php preg_match用于查找<img/>标签但不包含gif扩展名

时间:2013-02-18 08:50:06

标签: php regex preg-match

我知道如何在字符串中找到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,它会跳过它并继续搜索其他。

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

非常感谢!

3 个答案:

答案 0 :(得分:3)

不要这样做。尝试使用正则表达式解析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

答案 1 :(得分:1)

如果您仍想使用正则表达式,请尝试将模式更改为此类型。

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

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

答案 2 :(得分:1)

试试这个:

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

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

echo $matches['image'];
?>