ОК, я играл с этим некоторое время.Результат может быть не самым лучшим или самым прямым решением (и, честно говоря, я полностью не согласен с вашим подходом, если произвольные пользователи будут отправлять входные данные), но, похоже, он «работает».И, самое главное, он не использует регулярные выражения для анализа XML.:)
Подделка ввода
<code><?php
$str = <<<EOF
<code class="php"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
, это следует игнорировать
EOF;?>
Код
<?php
function recurse(&$doc, &$parent) {
if (!$parent->hasChildNodes())
return;
foreach ($parent->childNodes as $elm) {
if ($elm->nodeName == "code" || $elm->nodeName == "pre") {
$content = '';
while ($elm->hasChildNodes()) { // `for` breaks the `removeChild`
$child = $elm->childNodes->item(0);
$content .= $doc->saveXML($child);
$elm->removeChild($child);
}
$elm->appendChild($doc->createTextNode($content));
}
else {
recurse($doc, $elm);
}
}
}
// Load in the DOM (remembering that XML requires one root node)
$doc = new DOMDocument();
$doc->loadXML("<document>" . $str . "</document>");
// Iterate the DOM, finding <code /> and <pre /> tags:
recurse($doc, $doc->documentElement);
// Output the result
foreach ($doc->childNodes->item(0)->childNodes as $node) {
echo $doc->saveXML($node);
}
?>
Выход
<code><code class="php"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
это следует игнорировать
Доказательство
Вы можете видеть, как оно работает здесь .
Обратите внимание, что оно не вызывает явно htmlspecialchars
;DOMDocument
объект обрабатывает сам побег.
Надеюсь, это поможет.:)