HTML文字列内のすべてのdivを、属性を持つ段落(例<div id="1">
)を除く段落に置き換えるPHPスクリプトを開発しようとしています。私のスクリプトが現在最初に行うことは、単純なstr_replace()を使用して、のすべての出現箇所をで置き換えることです。これ<div>
により<p>
、属性と終了divタグ(</div>
)を持つすべてのdivタグが残ります。</div>
ただし、タグをタグに置き換えるの</p>
は少し問題があります。
</div>
これまで、いくつかのタグを</p>
開始タグと一致するタグに変換するように設計されたpreg_replace_callback関数を開発しましたが、属性で終了<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>
され、配列内に遭遇するとデクリメントされます。カウンターが0未満の場合は</p>
タグが返され、それ以外の場合はa</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>
スクリプトを思いつく限り編集するのに何時間も費やしましたが、同じ出力が得られ続けています。誰かが私がどこで間違っているのか説明したり、別の解決策を提供したりできますか?
どんな助けでもいただければ幸いです。