Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php删除重复的img标记_Php_String - Fatal编程技术网

使用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);