PHP将字符串转换为htmlentities

时间:2011-04-02 22:58:21

标签: php string html-entities

如何将<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>

4 个答案:

答案 0 :(得分:2)

您可以使用jquery。这将使用类code对任何标记内的任何内容进行编码。

$(".code").each(
    function () {
        $(this).text($(this).html()).html();
    }
);

小提琴:http://jsfiddle.net/mazzzzz/qnbLL/

答案 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"> &lt;div&gt; a div.. &lt;/div&gt; </code>

<pre class="php">
&lt;div&gt; a div.. &lt;/div&gt;
</pre>

<div> this should be ignored </div>

您听说过BB代码吗? http://en.wikipedia.org/wiki/BBCode

答案 2 :(得分:2)

好吧,我已经玩了一段时间了。结果可能不是最佳或最直接的解决方案(坦率地说,如果任意用户将要提交输入,我完全不同意您的方法),但它似乎“有效”。而且,最重要的是,它不使用正则表达式来解析XML。 :)

伪造输入

<?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"> &lt;div&gt; a div.. &lt;/div&gt; </code>

<pre class="php">
&lt;div&gt; a div.. &lt;/div&gt;
</pre>

<div> this should be ignored </div>

<强>证明

您可以看到它正常工作here

请注意,它没有明确调用htmlspecialchars; DOMDocument对象处理转义本身。

我希望这会有所帮助。 :)

答案 3 :(得分:1)

这有点关系,你不必使用Geshi,但我在这里写了一些代码Advice for implementing simple regex (for bbcode/geshi parsing),可以帮助你解决这个问题。

可以调整不使用GeSHi,只需要稍微修改一下。希望它能帮到你。