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

How to search and replace by comparing two PHP arrays

提问人:Jeff 提问时间:11/15/2009 最后编辑:Jeff 更新时间:11/16/2009 访问量:209

问:

我有这个字符串,我把所有的开始标签和所有的结束标签都放进去,就像这样:(array) $opened(array) $closed

'<div>
    Test
 </div>

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

结果为这两个数组:

$opened =

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"
}

$closed =

array(2) {
  [0]=> string(3) "div"
  [1]=> string(1) "p"
}

我需要以某种方式说:

在数组中找到第一个出现的 (即 ) 并将其从数组中删除,然后重复上述步骤,直到从 的顶部删除所有标记 ( 和 )。$closed[0]"div"$opened$opened$closed"div"p"$opened

PHP 数组

评论

0赞 meder omuraliev 11/15/2009
您是否使用我在另一个问题中给出的相同片段?:p
2赞 meder omuraliev 11/15/2009
不过你看过吗?我强烈建议使用它而不是这个。相信我,DOM 并不是那么难,而且比做你现在想做的事情要容易得多。
2赞 meder omuraliev 11/15/2009
正如许多人所坚持的那样,正则表达式不是处理解析 HTML 的方法,而且它比我建议的 DOM 方法更难。你能看看它并尝试一下吗?如果您有具体问题,请对我的回答发表评论。
2赞 Bart Kiers 11/15/2009
来吧,承认:你只是为了激怒博宾斯而发布这样的问题,对吧?:)
3赞 Gumbo 11/15/2009
为了至少拥有某种解析器,我会执行以下操作:在保留标签的同时拆分标签的输入(参见 PREG_SPLIT_DELIM_CAPTURE)。然后迭代各个部分,将开始标签放在堆栈上,看看是否有相应的结束标签,反之亦然。如果开始标签和结束标签匹配,请从堆栈中删除开始标签。这样做,您可以找到开始/结束标签的不匹配,并将其删除或在正确的位置添加对应的标签。preg_split

答:

0赞 lyscer 11/16/2009 #1

我不确定这是否是您要查找的内容,但这将删除您要查找的东西的第一个实例。

<?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 />";
?>
1赞 Jeff 11/16/2009 #2

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

<?php

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

?>

我还想出了一个有效的循环,但你必须独立操作 和,而且它需要更多的代码,所以我最终决定使用这个循环。for$opened[$i]$closed[$n]

0赞 Cups 11/16/2009 #3

我无法从您的问题中看出,但是如果您的目标是清理一段 html 代码,为什么不简单地使用 HTMLTidy 扩展呢?

教程