我知道如何在字符串中找到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'];
?>