我知道如何在字符串中找到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,它会跳过它并继续搜索其他。
请告诉我如何将代码更改为。
非常感谢!
答案 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'];
?>