我做到了 !我把它当作个人挑战,我终于用正则表达式做到了!
这段代码可能没有优化,那么请不要犹豫告诉我如何改进它(但使用正则表达式,而不是 DOM),但它仍然有效!:)
$str = '<div>
<h3>Test</h3>
<img/>
<p>Lorem ipsum</p>
<p>dolor sit</p>
<p><-- pagebreak --></p>
<p>amet</p>
<blockquote>
<p>
lol
<p>
</blockquote>
</div>';
$pagebreak_str = '-- pagebreak --';
$weird_replacement = '§~@';
$parsed = array();
$is_below_break = false;
while (preg_match ("#<([^/]+)>#isU",$str)) {
if ($is_below_break) {
$str = preg_replace ("#<" .$pagebreak_str. ">#isU", "", $str);
$str = preg_replace ("#<[^/>]+>(.+)</[^/>]+>#isU", "", $str);
$str = preg_replace ("#<[^/>]+/>#isU", "", $str);
}
else {
$get = preg_replace ("#^(.*)<([^/>]+)>(.*)$#isU","$2",$str,1);
if ($get == $pagebreak_str)
$is_below_break = true;
if (!$is_below_break)
$str = preg_replace ("#<([^/>]+)>#isU","$weird_replacement$1>",$str,1);
if (preg_match ("#</([^/>]+)>(.+)(<$pagebreak_str>)#isU", $str))
$str = preg_replace ("#</([^/>]+)>#isU", "$weird_replacement/$1>", $str, 1);
}
}
$str = preg_replace ("#$weird_replacement#isU", "<", $str);
echo $str;
此代码假设您没有任何 html 编码错误,例如交叉标记 (<div><a></div></a>),但它肯定使用正确的编码样式。
试试看,享受吧!