我在我的博客中使用<pre>
标签来发布代码。我知道我必须改变<
to<
和>
to >
。我需要为正确的 html 转义任何其他字符吗?
4 回答
如果您使用该<pre>
标签在您的博客上显示 HTML 标记会发生什么:
<pre>Use a <span style="background: yellow;">span tag with style attribute</span> to hightlight words</pre>
这将通过 HTML 验证,但它会产生预期的结果吗?没有。正确的方法是:
<pre>Use a <span style="background: yellow;">span tag with style attribute</span> to hightlight words</pre>
另一个例子:如果你使用pre标签来显示一些其他的语言代码,仍然需要HTML编码:
<pre>if (i && j) return;</pre>
这可能会产生预期的结果,但它是否通过了 HTML 验证?没有。正确的方法是:
<pre>if (i && j) return;</pre>
长话短说,HTML 编码 pre 标记的内容就像您使用其他标记一样。
TL;博士
- PHP:
htmlspecialchars($html);
- JavaScript (JS):
Element.innerText = "<html>...";
请注意,这<pre>
仅适用于样式,因此您必须转义所有 HTML。
只为你 HTML“化石”:使用<xmp>
标签
这不是众所周知的,但它确实存在,甚至 chrome 仍然支持它,但是不建议依赖使用一对<xmp>
标签- 它只是为您提供 HTML 化石,但这是处理您的个人内容的一种非常简单的方法,例如文档。甚至 w3.org Wiki 在其示例中也说:“不,真的。不要使用它。”
您可以将任何 HTML(不包括</xmp>
结束标记)放入其中<xmp></xmp>
<xmp>
<html> <br> just any other html tags...
</xmp>
正确的版本
正确的版本可以被认为是存储为字符串的 HTML,并在一些转义功能/机制的帮助下显示。
请记住一件事——类 C 语言中的字符串通常写在单引号或双引号之间——如果你将字符串包裹在 double => 中,你应该转义双精度数(可能使用\
),如果你将字符串包裹在单引号中 => 转义单打(可能与\
)...
最常见的 - 服务器端语言转义(例如在 PHP 中)
服务器端脚本语言通常有一些内置函数来转义 HTML。
<?php
$html = "<html> <br> or just any other HTML"; //store html
echo htmlspecialchars($html); //display escaped html
?>
请注意,在 PHP 8.1中进行了更改,因此您不再需要指定ENT_QUOTES
标志:
标志从 ENT_COMPAT 更改为 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401。
客户端方式(JavaScript / JS&jQuery 中的示例)
在客户端脚本中可以实现与服务器端类似的方法。
纯 JavaScript
没有功能,但有默认行为,如果您设置元素innerText
或节点textContent
:
document.querySelector('.myTest').innerText = "<html><head>...";
document.querySelector('.myTest').textContent = "<html><head>...";
HTMLElement.innerText
和不是一回事!您可以在上面的 MDN 文档链接中找到更多关于差异的信息Node.textContent
jQuery(一个 JS 库)
jQuery$jqueryEl.text()
为此目的:
$('.mySomething .test').text("<html><head></head><body class=\"test\">...");
只需记住与服务器端相同的事情 - 在类 C 语言中,将包含字符串的引号转义。
为了在您的标记中发布代码,我建议使用<code>标记。它的工作方式与 pre 相同,但在语义上被认为是正确的。
否则,<code> 和 <pre> 只需要对尖括号进行编码。
使用它,不要担心它们中的任何一个。
<pre>
${fn:escapeXml('
<!-- all your code -->
')};
</pre>
您需要启用 jQuery 才能使其工作。