2

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

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

非常感谢!

4

3 回答 3

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
于 2013-02-18T08:58:12.470 回答
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);
?>
于 2013-02-18T09:04:03.887 回答
1

试试这个 :

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

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

echo $matches['image'];
?>
于 2013-02-18T09:06:49.813 回答