我正在嘗試開發一個PHP腳本,用於替換除具有屬性(例如<div id="1">
)以外的段落的HTML字符串中的所有div。我的腳本目前所做的第一件事是使用簡單的str_replace()來替換<div>
與<p>
的所有匹配項,並且這留下了任何具有屬性和結束div標籤的div標籤(</div>
)。但是,用</p>
標籤替換</div>
標籤有點問題。使用preg_replace_callback函數替換結束div標記
到目前爲止,我已經開發了被設計成一些</div>
標籤轉換成</p>
標籤相匹配的開放<p>
標籤一個preg_replace_callback功能,卻忽略了其他</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>
標籤,否則返回</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喜愛題外話笑話頁](http://stackoverflow.com/questions/ 1732348 /正則表達式匹配開放標籤,除了-XHTML-自足標籤)。 (這個問題無處不在,但由於某種原因,實際上並不相關)。讀過笑話;儘管大多仍然不正確。你*可以*爲此目的使用正則表達式。這只是有點費力,需要一個'(?R)'遞歸正則表達式。可行,但不值得每次有人詢問時單獨回答。如果您只是使用現成的解決方案(如[tag:phpquery]或[tag:querypath])(html遍歷前端),則更簡單。 – mario 2012-01-07 19:44:58