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。这将使用classcode
对任何标记内的任何内容进行编码
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"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
</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"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
</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。这是一个先决条件,我想我应该在答复中提到。