如何通过比较两个PHP数组来搜索和替换

如何通过比较两个PHP数组来搜索和替换,php,arrays,Php,Arrays,我将所有开始标记放入(数组)$opened,所有结束标记放入(数组)$closed,如下所示: '<div> Test </div> <div> <blockquote> <p>The quick</p> <blockquote> <p>brown fox <span>jumps <span>over <

我将所有开始标记放入
(数组)$opened
,所有结束标记放入
(数组)$closed
,如下所示:

'<div>
    Test
 </div>

 <div>
    <blockquote>
       <p>The quick</p>
       <blockquote>
          <p>brown fox <span>jumps <span>over <img src="#" /> the'
$closed=

array(8) {
  [0]=> string(3)  "div"         // Need removed
  [1]=> string(3)  "div"
  [2]=> string(10) "blockquote"
  [3]=> string(1)  "p"           // Need removed
  [4]=> string(10) "blockquote"
  [5]=> string(1)  "p"
  [6]=> string(4)  "span"
  [7]=> string(4)  "span"
}
array(2) {
  [0]=> string(3) "div"
  [1]=> string(1) "p"
}
我得说:


$opened
数组中找到第一个出现的
$closed[0]
(即
“div”
)并将其从
$opened
数组中删除,然后重复,直到所有
$closed
标记(
“div
“p”
)已从
$opened
顶部删除,我不确定这是否是您要查找的内容,但这将删除您要查找的内容的第一个实例

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

$opened_tags = array("div", "div", "blockquote", "p", "blockquote", "p", "span", "span");
$closed_tags = array("div", "p");

$find = "div";

$size = sizeof($closed_tags);
for($i=0; $i<$size; $i++) {
    if($closed_tags[$i] == $find){
        unset($closed_tags[$i]);
        break;
    }
}

echo "closed_tags with empty spaces: ".print_r($closed_tags, true)."<br /><br />";

$closed_tags = array_values($closed_tags);
echo "closed_tags array indexed correctly: ".print_r($closed_tags, true)."<br />";
?>

希望这对某人有所帮助。这就是我想到的:

<?php

    for ( $i = 0; $i < $num_closed; $i++ )
    {
        unset ( $opened[ array_search( $closed[ $i ], $opened ) ] );
    }

?>


我还为循环设计了一个,但您必须操作$opened[$I]和$closed[$n]是独立的,而且代码要多一些,所以我最终决定使用这个。

我不能从你的问题中看出,但是如果你的目的是清理html代码片段,为什么不简单地使用HTMLIDY扩展呢


您是否使用了我在另一个问题中给出的相同代码段?:Phae您看过了吗?我强烈建议您使用它而不是这个。相信我,DOM并不是那么难,而且比您现在尝试的要容易得多。正如许多人坚持的那样,regex不是解析HTML的方法,而且它比我建议的DOM方法。你能看一看并尝试一下吗?如果你有具体的问题,请评论我的答案。来吧,坦白说:你发布这样一个问题只是为了激发,对吧?:)为了至少有一种解析器,我会做以下操作:在保留标记的同时拆分输入(请参见
preg\u split
的preg\u split\u DELIM\u捕获)。然后迭代各部分,将开始标记放在堆栈上,查看是否有相应的结束标记,反之亦然。如果开始标记和结束标记匹配,则从堆栈中删除开始标记。这样做可以发现开始/结束标记不匹配,并将其删除或在正确位置添加对应标记。