【发布时间】:2012-01-07 19:21:53
【问题描述】:
我正在尝试开发一个 PHP 脚本,它将 HTML 字符串中的所有 div 替换为具有属性的段落除外(例如 <div id="1">)。我的脚本目前做的第一件事是使用一个简单的 str_replace() 将所有出现的<div> 替换为<p>,这会留下任何带有属性和结束 div 标签 (</div>) 的 div 标签。但是,用</p> 标签替换</div> 标签有点问题。
到目前为止,我已经开发了一个 preg_replace_callback 函数,该函数旨在将一些 </div> 标签转换为 </p> 标签以匹配开始 <p> 标签,但在结束 @987654334 时忽略其他 </div> 标签@ 带有属性。以下是我正在使用的脚本;
<?php
$input = "<div>Hello world!</div><div><div id=\"1\">How <div>are you</div> today?</div></div><div>I am fine.</div>";
$input2 = str_replace("<div>", "<p>", $input);
$output = preg_replace_callback("/(<div )|(<\/div>)/", 'replacer', $input2);
function replacer($matches){
static $count = 0;
$counter=count($matches);
for($i=0;$i<$counter;$i++){
if($matches[$i]=="<div "){
return "<div ";
$count++;
} elseif ($matches[$i]=="</div>"){
$count--;
if ($count>=0){
return "</div>";
} elseif ($count<0){
return "</p>";
$count++;
}
}
}
}
echo $output;
?>
该脚本基本上将所有剩余的<div> 和</div> 标签放入一个数组中,然后循环遍历它。然后,计数器变量在遇到<div> 标记时递增,或者在遇到数组中的</div> 时递减。当计数器小于 0 时,返回 </p> 标签,否则返回 </div>。
脚本的输出应该是;
<p>Hello world!</p><p><div id="1">How <p>are you</p> today?</div></p><p>I am fine.</p>"
相反,我得到的输出是;
<p>Hello world!</p><p><div id="1">How <p>are you</p> today?</p></p><p>I am fine.</p>
我花了几个小时对脚本进行了我能想到的尽可能多的编辑,而且我一直得到相同的输出。谁能向我解释我哪里出错或提供替代解决方案?
任何帮助将不胜感激。
【问题讨论】:
-
见SO favourite off-topic joke page。 (这在任何地方都被不必要地张贴了,但由于某种原因,它从来没有真正相关过)。阅读过去的笑话;虽然大部分还是不正确的。您可以将正则表达式用于此类目的。这有点费力,需要
(?R)递归正则表达式。可行,但不值得每次有人问时单独回答。如果您只使用像phpquery 或querypath 这样的现成解决方案(html 遍历前端),则会更简单。