PHP将字符串转换为htmlentities

PHP将字符串转换为htmlentities,php,string,html-entities,Php,String,Html Entities,如何将和标记中的代码转换为html实体 <code class="php"> <div> a div.. </div> </code> <pre class="php"> <div> a div.. </div> </pre> <div> this should be ignored </div> $(".code").each( function () {

如何将
标记中的代码转换为html实体

<code class="php"> <div> a div.. </div> </code>

<pre class="php">
<div> a div.. </div>
</pre>

<div> this should be ignored </div>
$(".code").each(
    function () {
        $(this).text($(this).html()).html();
    }
);
一个div
一个部门。。
这一点应该被忽略

这在某种程度上是相关的,您不必使用Geshi,但我在这里编写了一些代码,可以帮助您解决这个问题


它可以调整为不使用格士,只是需要一点修补。希望它能帮助你。

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

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);
        }
    }
}
小提琴:PHP

<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>
if(preg#u match_all(“#\(.*?\#is“,$html,$code)){
未设置($code[0]);
foreach($code as$array){
foreach($array作为$value){
$html=str_replace($value,htmlentities($value,entu引号),$html);
}
}
}
HTML

div a div/div
div a div/div 这一点应该被忽略
你听说过BB码吗?
好的,我已经玩了一段时间了。结果可能不是最好或最直接的解决方案(坦率地说,如果任意用户将提交输入,我完全不同意您的方法),但它似乎“起作用”。而且,最重要的是,它不使用正则表达式来解析XML

伪造输入

<?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>
removeChild($child);
}
$elm->appendChild($doc->createTextNode($content));
}
否则{
递归($doc$elm);
}
}
}
//加载到DOM中(记住XML需要一个根节点)
$doc=新的DOMDocument();
$doc->loadXML(“$str.”);
//迭代DOM,查找和标记:
递归($doc,$doc->documentElement);
//输出结果
foreach($doc->childNodes->item(0)->childNodes as$node){
echo$doc->saveXML($node);
}
?>
输出

<?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);
}

?>
div a div/div
div a div/div 这一点应该被忽略 证明

你可以看到它在工作

注意,它没有显式调用
htmlspecialchars
DOMDocument
对象处理转义本身



我希望这有帮助

取决于上下文。代码驻留在哪里?在字符串中?是的,它是php字符串variable@Alexandra这很困难,因为您需要首先解析结构,以区分需要实体的部分和不需要实体的部分。为什么一开始是这样混合的?你能影响这是如何产生的吗?我不能。。这是访问者发布评论时的输出,我希望他们能够发布htmltoo@Alexandra你不能只让访问者在你的网站上发布HTML——这会导致XSS攻击,并允许机器人发布普通访问者看不见的非常讨厌的垃圾邮件,但对搜索引擎机器人可见。+1只要结果HTML不是不安全的,我推荐这种方法。这个问题是关于PHP,而不是Javascript。但是如果代码被转义,你怎么会被黑客攻击呢?stackoverflow也做同样的事情……@Alexandra:不,它没有。堆栈溢出接受严格的HTML子集。您拒绝严格的HTML子集。@Tomalak,但我只对代码内部的内容这样做。在评论的其余部分,我正在剥离标签,就像这样,这不是很灵活。你要求标签有一个非常严格的文本布局。我不明白,它和你的一样容易破坏,非文本布局只是一个黑客的尝试。@webarto:不,它更容易破坏。Mine需要有效的XML;您的需要精确的文本匹配。用户无法在标记内写入更多空格(否则有效),或在标记中添加更多参数(否则也有效)。您的也与
..
匹配。您所说的精确匹配是指
?对但它应该是严格的。我可以在您的
code
pre
标记中插入内联CSS或JS吗?(这没有任何意义,因为在本例中,您可以在外部使用HTML)。是的,它确实匹配
..
。但有效的XML是先决条件:)@webarto:
AB
是有效的XML,但您的代码(我相信)无法在其中转义
B
。。。你的和我的一样容易破碎。PS我比你少浪费了16分钟。@webarto:谢谢你的非建设性评论。你能提供一个破坏我的代码的输入示例,以便我可以修复它吗?PS:如果你在帮助别人,这不是浪费。这是12分钟。我刚刚注意到HTML似乎被转义了两次。现在已经修复了。它不是非结构化的(),如果只添加一个未打开的结束标记,则会带来致命错误。无论如何,您的代码很花哨,但在实际情况下,它一文不值,就像我的一样。@webarto:当然,需要有效的XML。这是一个先决条件,我想我应该在答复中提到。