如何在PRE或类似文件中显示原始html代码,但不转义它

如何在PRE或类似文件中显示原始html代码,但不转义它,html,pre,Html,Pre,我想显示原始HTML。我们都知道,一个人必须像这样逃避每一次 <PRE> this is a test &ltDIV&gt </PRE> <pre><![CDATA[ This is a demo, tags like <p> will appear literally. ]]></pre> echo '<pre>' . htmlspecialchars("<div>&

我想显示原始HTML。我们都知道,一个人必须像这样逃避每一次

     <PRE> this is a test  &ltDIV&gt </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仍然对其进行了描述,并要求浏览器支持它(虽然它也告诉作者不要使用它,但它并不能真正阻止你)

    xmp
    xmp
    中的所有内容都被视为这样,没有任何标记(标记或字符引用)被识别,除非出于明显的原因,元素本身的结束标记

    否则,
    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  &ltDIV&gt </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>';