如何将<code>
和<pre>
标记内的代码转换为html实体?
<code class="php"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
</pre>
<div> this should be ignored </div>
答案 0 :(得分:2)
您可以使用jquery。这将使用类code
对任何标记内的任何内容进行编码。
$(".code").each(
function () {
$(this).text($(this).html()).html();
}
);
答案 1 :(得分:2)
PHP
if(preg_match_all('#\<(code|pre) class\=\"php\"\>(.*?)\</(code|pre)\>#is', $html, $code)){
unset($code[0]);
foreach($code as $array){
foreach($array as $value){
$html = str_replace($value, htmlentities($value, ENT_QUOTES), $html);
}
}
}
HTML
<code class="php"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
</pre>
<div> this should be ignored </div>
您听说过BB代码吗? http://en.wikipedia.org/wiki/BBCode
答案 2 :(得分:2)
伪造输入
<?php
$str = <<<EOF
<code class="php"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
</pre>
<div> this should be ignored </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 class="php"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
</pre>
<div> this should be ignored </div>
<强>证明强>
您可以看到它正常工作here。
请注意,它没有明确调用htmlspecialchars
; DOMDocument
对象处理转义本身。
我希望这会有所帮助。 :)
答案 3 :(得分:1)
这有点关系,你不必使用Geshi,但我在这里写了一些代码Advice for implementing simple regex (for bbcode/geshi parsing),可以帮助你解决这个问题。
可以调整不使用GeSHi,只需要稍微修改一下。希望它能帮到你。