使用php删除重复的img标记
在这样的字符串中:使用php删除重复的img标记,php,string,Php,String,在这样的字符串中: <body> <img src="specialpic" /> <p>sometext</p><br> <img src="/somepic.png" /> <img src="/somepic.png" /> <p>someotherstuff</p> <img src="/anotherpic.png" /> &
<body>
<img src="specialpic" />
<p>sometext</p><br>
<img src="/somepic.png" />
<img src="/somepic.png" />
<p>someotherstuff</p>
<img src="/anotherpic.png" />
<img src="/anotherpic.png" />
</body>
为此使用HTML解析器。使用
DOMDocument
查看此示例
初始化DOMDocument
并加载HTML文件:
$dom = new DOMDocument();
libxml_use_internal_errors(1);
$dom->formatOutput = True;
$dom->loadHTML($html);
初始化两个空数组:$img
将包含唯一的src
值,$toDelete
将包含要删除的重复节点:
$img = $toDelete = array();
使用$img
数组搜索具有属性的所有节点:如果找到该节点,请将当前节点添加到$toDelete
,否则将src
值添加到$img
:
$nodes = $dom->getElementsByTagName( 'img' );
最后,执行foreach
循环以删除找到的节点:
foreach( $nodes as $node )
{
$src = $node->getAttribute('src' );
if( in_array( $src, $img ) ) $toDelete[] = $node;
else $img[] = $src;
}
要打印生成的HTML,请执行以下操作:
foreach( $toDelete as $node ) $node->parentNode->removeChild( $node );
请注意$toDelete
数组的用法。理论上,我们可以直接删除第一个foreach
中的节点,但通过这种方式,我们减少了原始找到集的长度,因此跳过了下一个节点
- 阅读更多关于
- 阅读
根据您的问题,虽然由于HTML的性质,不完全推荐使用,但假设图像标记始终采用相同的格式,或者在比较时字符与字符之间完全相同,这在子模式中是可能的
试试这个:
echo $dom->saveHTML();
$input=有没有更快的方法??也许可以使用一些php字符串函数?您可以(不)使用正则表达式,但使用HTML最好的方法是通过解析器,否则会产生意想不到的结果。阅读
echo $dom->saveHTML();
$input =<<<EOF
<body>
<img src="specialpic" />
<p>sometext</p><br>
<img src="/somepic.png" />
<img src="/somepic.png" />
<p>someotherstuff</p>
<img src="/anotherpic.png" />
<img src="/anotherpic.png" />
</body>
EOF;
$result = preg_replace('|(<img\s*src=.*?\s*/>\s*)\1*|s', '\1', $input);