如何在PRE或类似文件中显示原始html代码,但不转义它
我想显示原始HTML。我们都知道,一个人必须像这样逃避每一次如何在PRE或类似文件中显示原始html代码,但不转义它,html,pre,Html,Pre,我想显示原始HTML。我们都知道,一个人必须像这样逃避每一次 <PRE> this is a test <DIV> </PRE> <pre><![CDATA[ This is a demo, tags like <p> will appear literally. ]]></pre> echo '<pre>' . htmlspecialchars("<div>&
<PRE> this is a test <DIV> </PRE>
<pre><![CDATA[
This is a demo, tags like <p> will
appear literally.
]]></pre>
echo '<pre>' . htmlspecialchars("<div><b>raw HTML</b></div>") . '</pre>';
<textarea>Some raw content</textarea>
这是一个测试<DIV>
不过,我不想这样做。我想要一种保持HTML代码原样的方法(因为它更容易阅读,(在编辑器中),我可能想复制它并将其作为实际的HTML代码再次使用,并且不想再次更改它或有相同代码的两个版本一个转义,一个不转义)
是否有其他比PRE更“原始”的环境允许这样做?所以,人们不必每次都编辑HTML并更改所有内容来显示一些原始HTML代码,可能是HTML5
类似于
基本上,原始问题可分为两部分:
- 主要目标/挑战:嵌入(/传输)原始格式化代码段
(任何类型的代码)在网页的标记中(用于简单的复制/粘贴/编辑,因为没有
编码/转义)
- 在中正确显示/呈现该代码段(可能编辑它)
浏览者
简短(但)模棱两可的回答是:你不能,…但你可以(非常接近)。
(我知道,这是3个相互矛盾的答案,所以请继续阅读…)
(polyglot)(x)(ht)ml标记语言几乎依赖于包装开始/开始和结束/结束标记/字符(序列)之间的所有内容。
因此,要在标记语言中嵌入任何类型的原始代码/代码段,必须对每个与关闭标记中包装“container”元素的字符(-sequence)相似的实例(在该代码段中)进行转义/编码。(在这篇文章中,我将把它称为规则1)
想想这里的“一些”数据“
或。用“-tag
关闭斜体,很明显应该转义/编码(在中的某物),或U+002F索里达(/)
因此,不管怎样,textarea都需要一个强大的实体转换处理程序或
它最终会对实体产生影响
CDATA
(字符数据)不会将文本中的标记视为
标记并不会展开实体
因此,只要原始代码片段不违反规则1(不能违反规则1)
在代码段中包含容器结束字符(序列),此
不需要其他转义/编码
显然,这可以归结为:我们如何最大限度地减少代码段原始源中仍然需要编码的字符/字符序列的数量,以及该字符(序列)在平均代码段中出现的次数;对于处理这些字符(如果出现)的翻译的javascript来说,这也是非常重要的
那么什么“容器”具有这种CDATA
上下文呢
标记的大多数值属性都是CDATA,因此可以(ab)使用隐藏输入的值属性()。
但是(符合规则1)这会在原始代码段中产生嵌套引号(“
和”
)的编码/转义问题,需要一些javascript来获取/翻译并在另一个(可见)元素中设置代码段(或简单地将其设置为文本区域的值)。不知何故,这给了我FF中实体的问题(就像在textarea中一样)。但这并不重要,因为必须转义/编码嵌套引号的“代价”高于(HTML5)textarea(引号在源代码中非常常见)
尝试(ab)使用bla&bla]>
?
正如Jukka在他的扩展答案中指出的,这只适用于(罕见的)“真正的xhtml”。
我曾想过使用一个脚本标记(在脚本标记中有或没有这样的CDATA包装器)和一个多行注释/**/
来包装原始片段(脚本标记可以有一个id
,您可以按计数访问它们)。但是,由于这显然会在*/
、]]>
和中引入转义问题,因此可以使用xmp
元素,请参见。它从一开始就以HTML格式出现,并且受到所有浏览器的支持。规范对此表示不满,但HTML5 CR仍然对其进行了描述,并要求浏览器支持它(虽然它也告诉作者不要使用它,但它并不能真正阻止你)
xmpxmp
中的所有内容都被视为这样,没有任何标记(标记或字符引用)被识别,除非出于明显的原因,元素本身的结束标记
否则,xmp
会像pre
一样呈现
当使用“真正的XHTML”时,即使用XML媒体类型的XHTML(这是罕见的),特殊的解析规则不适用,因此xmp
被视为pre
。但在“真正的XHTML”中,您可以使用CDATA节,这意味着类似的解析规则。它没有特殊的格式,因此您可能希望将其包装在pre
元素中:
将
从字面上看。
]]>
我不知道如何将xmp
和CDATA部分结合起来以实现所谓的多语言标记如果启用了jQuery,则可以使用escapeXml函数,而不必担心转义箭头或特殊字符
${fn:escapeXml('
')};
echo'.htmlspecialchars(“原始HTML”)';
我想这就是你要找的
换句话说,在PHP中使用htmlspecialchars()@GitaarLAB和@Jukka详细说明,
标记已经过时,但仍然是最好的
<PRE> this is a test <DIV> </PRE>
<pre><![CDATA[
This is a demo, tags like <p> will
appear literally.
]]></pre>
echo '<pre>' . htmlspecialchars("<div><b>raw HTML</b></div>") . '</pre>';
<textarea>Some raw content</textarea>
这是一个既便宜又愉快的回答:
echo '<code>' . htmlspecialchars("<div><b>hello world</b></div>") . '</code>';
一些原始内容
文本区将逐字处理制表符、多个空格、换行符和换行符。
它可以很好地复制和粘贴其有效的HTML。它还允许用户调整代码框的大小。
您不需要任何CSS、JS、转义和编码
您也可以改变外观和行为。
H
<xmp><div>Lorem ipsum</div>
<p>Hello</p>
</xmp>
xmp { margin: 5px 0; padding: 0 5px 5px 5px; background: #CCC; }
xmp:before { content: ""; display: block; height: 1em; margin: 0 -5px -2em -5px; }
<textarea>Some raw content</textarea>
<textarea
style="width:100%; font-family: Monospace; font-size:10px; border:0;"
rows="30" disabled
>Some raw content</textarea>
<xmp>
# your code...
</xmp>
echo '<code>' . htmlspecialchars("<div><b>hello world</b></div>") . '</code>';