我正在使用bootstrap select来显示类别,我正在使用htmlspecialchars清理这些类别但由于某种原因,当它在数据内容属性内部时它不起作用,因为我有一个名为的类别,浏览器将其解释为是一个真正的HTML标签,而不是一个字符串。我曾尝试使用htmlentitites,但它也不起作用...我也有关于使用urlencode但因为我使用bootstrap选择我不知道在哪里解码它...
这是我的代码:
"<option value='$row[id]' data-content='<span class=\"glyphicon glyphicon-stop\"
style=\"color:$row[cor]\"></span> <span style=\"text-align:left\">
".htmlspecialchars("$row[nome]",ENT_QUOTES)."
</span>'>".htmlspecialchars("$row[nome]",ENT_QUOTES)."</option>";
谢谢!
答案 0 :(得分:0)
<
被解释为HTML标记的开头
<
是HTML编码的实体,将被解释为字符“&lt;”。
如果将类似HTML的内容放入属性中,则需要对其进行HTML编码以避免破坏HTML属性。例如,如果您希望在属性中包含引号,那么该属性将被引号括起来,只需要"
:
attribute=""value""
bootstrap-select使用data-content
属性的值作为HTML
因此data-content="<span>"
将最终成为HTML元素<span>
。
如果您希望它最终作为文本“&lt; span&gt;”,则需要提供呈现文字“&lt; span&gt;”的HTML,即<span>
。由于您将其添加到HTML属性中,因此您需要将 编码为:
data-content="&lt;span&gt;"
☝️这是<span>
正确的HTML编码值(因为它在一个属性中),当被解释为HTML时(如bootstrap-select所示)将呈现为文本“&lt; span&gt; ;”
所以:
$attrTemplate = '<span class="glyphicon glyphicon-stop" style="color:%s"></span>
<span style="text-align:left">%s</span>';
$attr = sprintf($attrTemplate, htmlspecialchars($row['cor']), htmlspecialchars($row['nome']));
$optionTemplate = '<option value="%s" data-content="%s">%s</option>';
printf($optionTemplate, htmlspecialchars($row['id']), htmlspecialchars($attr), htmlspecialchars($row['nome']));
正如您所看到的,您希望保留为HTML的所有内容都必须采用HTML编码(此处使用htmlspecialchars
)。
另见The Great Escapism (Or: What You Need To Know To Work With Text Within Text)。