我正在尝试开发一个 PHP 脚本,它将 HTML 字符串中的所有 div 替换为段落,除了那些具有属性的段落(例如<div id="1">
)。我的脚本目前做的第一件事是使用简单的 str_replace() 替换所有出现的<div>
with <p>
,这会留下任何带有属性的 div 标记和结束 div 标记 ( </div>
)。但是,用</div>
标签替换标签</p>
有点问题。
到目前为止,我已经开发了一个 preg_replace_callback 函数,该函数旨在将一些</div>
标签转换为</p>
标签以匹配开始标签,但当它们以属性结束时<p>
忽略其他标签。下面是我正在使用的脚本;</div>
<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>
数组中的 a 时递减。当计数器小于 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>
我花了几个小时对脚本进行了我能想到的尽可能多的编辑,而且我一直得到相同的输出。谁能向我解释我哪里出错或提供替代解决方案?
任何帮助,将不胜感激。