HTMLでHTMLスニペットを表示する


208

どのように私は、各を交換することなく、WebページのHTMLスニペットを表示することができ<&lt;>して&gt;

つまり、終了タグを押すまでHTMLをレンダリングしないタグはありますか?

回答:


95

いいえ、ありません。適切なHTMLでは、いくつかの文字をエスケープする以外に方法はありません。

  • & なので &amp;
  • < なので &lt;

(ちなみに、脱出する必要はありませんが>、対称性の理由で脱出することがよくあります。)

そしてもちろん、結果のエスケープされたHTMLコード<pre><code>…</code></pre>を(a)空白と改行を保持し、(b)コード要素としてマークアップするために囲む必要があります。

このようにあなたのコードをラッピングなど他のすべてのソリューション、<textarea>または(非推奨)<xmp>要素は、壊れます1

(HTTP経由でXMLとしてブラウザに宣言されているXHTML Content-Type!ヘッダ-単に設定することDOCTYPE十分ではないが)代わりにCDATAセクションを使用することができます。

<![CDATA[Your <code> here]]>

ただし、これはHTMLではなくXMLでのみ機能します。また、コードに終了区切り文字を含めることはできないため、これは完全な解決策ではありません]]>。したがって、XMLでさえ、最も単純で最も堅牢なソリューションは、エスケープによるものです。


1適例:


いいね。これはHTML標準の一部ですか?それとも、xml-standardの一部のように、より深いですか?
aoobe

7
HTMLでは、これは `here]]>`をレンダリングします
Dolph

3
はい、これは良い答えですが、次のように置き換えること>を 忘れないでください&gt;
アラン

2
@Alan私もこれを行いますが、実際には必要ありません。置換する必要があるだけ<&、エスケープなし>はHTML内で有効です。
Konrad Rudolph、

1
@SamWatkinsしかし、あなたの解決策は私のものより簡単ではありません。エスケープする必要があるものを変更しただけ、ソリューションはハッキーです。文字通り、適切に実行することに勝る利点はありません。これは正しい解決策で解決された問題です。セットアップ全体がハッキングされていない限り、ハッキングは必要ありません。
Konrad Rudolph

161

HTMLの実証済みの方法:

  1. &文字を置き換える&amp;
  2. <文字を置き換える&lt;
  3. >文字を置き換える&gt;
  4. オプションで、HTMLサンプルをタグ<pre><code>タグで囲みます。

17
ヒント:HTMLコードの置き換えを高速化するには、拡張子 'TextFX'を付けたNotepad ++を使用できます。テキストをマークし、メニュー> TextFX> TextFX Convert> Encode HTML(&<> ")に移動します→完了
Kai Noack

2
万が一これを実行できる既存のJavaScriptライブラリはありますか?
アンダーソングリーン

9
これは、「交換する必要がない...」という質問には答えません。また、「>」の置換は不要です。
Jukka K. Korpela 14

2
そして、順序も重要です。&最初と<その後の処理を確認してください。
Tolga Evcimen 2015年

151

最良の方法:

<xmp>
// your codes ..
</xmp>

古いサンプル:

サンプル1

<pre>
  This text has
  been formatted using
  the HTML pre tag. The brower should
  display all white space
  as it was entered.
</pre>

サンプル2

<pre>
  <code>
    My pre-formatted code
    here.
  </code>
</pre>

サンプル3:(実際にコードブロックを「引用」している場合、マークアップは次のようになります)

<blockquote>
  <pre>
    <code>
        My pre-formatted "quoted" code here.
    </code>
  </pre>
</blockquote>

素晴らしいCSSサンプル:

pre{
  font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
  margin-bottom: 10px;
  overflow: auto;
  width: auto;
  padding: 5px;
  background-color: #eee;
  width: 650px!ie7;
  padding-bottom: 20px!ie7;
  max-height: 600px;
}

構文強調コード(プロ用):

レインボー (非常に完璧)

かわいがる

構文ハイライター

ハイライト

JSHighlighter


あなたに最適なリンク:

http://net.tutsplus.com/tutorials/html-css-techniques/quick-tip-how-to-add-syntax-highlighting-to-any-project/

https://github.com/balupton/jquery-syntaxhighlighter

http://bavotasan.com/2009/how-to-wrap-text-within-the-pre-tag-using-css/

http://alexgorbatchev.com/SyntaxHighlighter/

https://code.google.com/p/jquery-chili-js/

HTMLでソースコードを強調表示する方法


4
回答で使用されている要素は、質問にはまったく対応していません。タグの開始の「<」の解釈には影響しません。
Jukka K.Korpela 14

7
developer.mozilla.org/en-US/docs/Web/HTML/Element/xmpは、「この要素は使用しないでください。これはHTML3.2から廃止され、一貫した方法で実装されていませんでした。完全に削除されました。 HTML5の言語。」
Nick Rice

50

コードを表示する単純な方法の1つは、それをtextareaに含め、無効にした属性を追加して編集できないようにすることです。

<textarea disabled> code </textarea>

物事を成し遂げる簡単な方法を探している誰かを助けることを願っています。


7
読み取り専用の属性は、無効にするよりも優れているため、その中のテキストを強調表示できます。二次的なものですが、それをinput要素のように見えるようにする機能を取り除くスタイルを追加することもできます。
ターキン

2
素晴らしいソリューション。ありがとう
Apit John Ismail 2017

1
アンパサンドは引き続き解釈されます。例:&nbsp; 実際の改行しないスペースとしてレンダリングされます。しかし、それでも私がやりたいことにはそれが理想的です。
Nick Rice

1
私は多くの方法を試しましたが、これが私に有効な唯一の方法です。どうもありがとう。
William Hou

25

非推奨ですが、FF3およびIE8で機能します。

<xmp>
   <b>bold</b><ul><li>list item</li></ul>
</xmp>

推奨:

<pre><code>
    code here, escape it yourself.
</code></pre>


12

非推奨 <xmp>タグは基本的にそれを行いますが、XHTML仕様の一部ではなくなりました。現在のすべてのブラウザでも動作します。

ここに別のアイデアがあります。ハック/パーラーのトリックです。次のようにコードをテキストエリアに配置できます。

<textarea disabled="true" style="border: none;background-color:white;">
    <p>test</p>
</textarea>

山かっことこのようなコードをテキスト領域内に配置すると、HTMLが無効になり、異なるブラウザーで未定義の動作が発生します。Internet ExplorerではHTMLが解釈されますが、Mozilla、Chrome、Safariでは解釈されません。

編集不可にして外観を変えたい場合は、CSSを使用して簡単にスタイルを設定できます。唯一の問題は、ブラウザが右下隅に小さなドラッグハンドルを追加して、ボックスのサイズを変更することです。または、代わりにinputタグを使用してみてください。

textareaにコードを挿入する正しい方法は、たとえば次のPHPのようなサーバー側言語を使用することです。

<textarea disabled="true" style="border: none;background-color:white;">
    <?php echo '<p>test</p>'; ?>
</textarea>

次に、htmlインタープリターをバイパスし、未解釈のテキストをすべてのブラウザーで一貫してtextareaに配置します。

それ以外は、静的HTMLの場合はコードを自分でエスケープするか、そのようなテクノロジを使用する場合は.NETのHtmlEncode()などのサーバー側メソッドを使用するのが唯一の方法です。


1
これは恐ろしい考えです。動的HTMLが表示されていて、誰かが次のことをしたとしたらどうでしょう。<?php echo '</ textarea> <script> alert(\' hello world \ '); </ script> <textarea>'; />。したがって、コードはxssに対して脆弱です。
Gary Drocella 2014

PHPはサーバー側であるため、ブラウザで表示される結果は変わりません。特にHTMLインタープリターをバイパスしません。
Robert Siemer 2017年

入力ボックスのように見えないように、テキストエリアのフォーマットが好きです。私はまた、ラッピングを減らすために、100%の幅を追加:<textarea disabled="true" style="border: none;background-color:white; width:100%">
ダンキング

@GaryDrocella <script>タグをtetareaに挿入すると、&lt;に変換されます。と&gt; 自動的に実行されるため、スクリプトは実行されません
bluejayke

6

HTMLで?番号。

XML / XHTMLで?あなたはCDATAブロックを使うことができます。


6

それは非常に簡単です...このxmpコードを使用してください

    <xmp id="container">

&lt;xmp &gt;

    <p>a paragraph</p>

    &lt;/xmp &gt;

</xmp>

6

私が想定し:

  • 100%有効なHTML5を書きたい
  • コードスニペット(ほとんど)をHTMLに配置したい
    • 特に<エスケープする必要はありません

すべてのオプションはこのツリーにあります:

  • HTML構文
    • 5種類の要素があります
    • 「通常の要素」と呼ばれるもの( <p>
      • リテラルを持つことはできません <
      • 次のタグまたはコメントの開始と見なされます
    • 空の要素
      • 彼らにはコンテンツがありません
      • HTMLをデータ属性に配置できます(ただし、これはすべての要素に当てはまります)
      • データを別の場所に移動するにはJavaScriptが必要です
      • 二重引用符で囲まれた属性で"&thing;エスケープする必要がある:&quot;および&amp;thing;それぞれ
    • 生のテキスト要素
      • <script> そして <style>唯一
      • それらは表示されません
      • しかしあなたのテキストをJavascriptに埋め込むことは現実的かもしれません
      • Javascriptでは、バックティック付きの複数行の文字列が可能です
      • その後、動的に挿入できます
      • リテラル</scriptはどこでも許可されていません<script>
    • 回避可能な生のテキスト要素
      • <textarea> そして <title>唯一
      • <textarea> コードをラップするのに適した候補です
      • 書くことは完全に合法です </html>そこ
      • 部分文字列は合法ではありません </textarea明らかな理由から
        • &lt;/textareaまたはこのような特殊なケースをエスケープする
      • &thing; エスケープする必要があります: &amp;thing;
    • 異元素
      • MathMLおよびSVG名前空間の要素
      • 少なくともSVGは再びHTMLの埋め込みを許可します...
      • CDATAが許可されているため、可能性があるようです
  • XML構文

 

注:>エスケープする必要はありません。通常の要素でもそうではありません。


1
私はあなたの答えの包括的なアプローチが好きです。いくつかの修正:<script>そして<style>、可視化することができます。JavaScript として実行したくない場合は、<body>with style="display: block; white-space: pre;"およびtype="text/html"/または何かの中に追加してください。それは私が考える非常に素晴らしいトリックであり、文芸的なプログラミングと教育に適しています。また<xmp>、非推奨ですが、主要なブラウザーにも実装されています。
Sam Watkins

面白い。@SamWatkins <xmp>は有効なHTML5ではありませんが、他のトリックは適切に見えます!
Robert Siemer

5

目標が同じページの別の場所で実行しているコードのチャンクを表示することである場合は、textContentを使用できます(pure-jsで十分にサポートされています:http ://caniuse.com/#feat=textcontent )

<div id="myCode">
    <p>
        hello world
    </p>
</div>

<div id="loadHere"></div>


document.getElementById("myCode").textContent = document.getElementById("loadHere").innerHTML;

結果に複数行の書式を設定するには、CSSスタイルの "white-space:pre;"を設定する必要があります。ターゲットdivで、各行の最後にある「\ r \ n」を使用して個別に行を記述します。

これがデモです:https : //jsfiddle.net/wphps3od/

この方法には、textareaを使用するよりも利点があります。textareaの場合のようにコードを再フォーマットすることはありません。(のようなもの&nbsp;はテキストエリアで完全に削除されます)


これは、JavaScriptとDOM APIを使用してエスケープするための非常に優れたアプローチです。<template>通常はレンダリングされないものと一緒に使用できます。
Sam Watkins

3

結局のところ、(迷惑ではありますが)最良の答えは「テキストをエスケープする」ことです。

ただし、これを自動的に実行できる多くのテキストエディタ(またはスタンドアロンのミニユーティリティ)があります。したがって、必要がない場合は手動でエスケープする必要はありません(エスケープされたコードとエスケープされていないコードの混合でない限り...)

クイックGoogle検索でこれが表示されます例:http : //malektips.com/zzee-text-utility-html-escape-regular-expression.html


3
<textarea ><?php echo htmlentities($page_html); ?></textarea>

私にとってはうまくいきます。

Alexander's提案を覚えておいてください、これが私がこれが良いアプローチだと思う理由です」

単純<textarea>に試してみただけではtextarea、親タグが誤って閉じられ、残りのHTMLソースが親ドキュメントに表示される可能性がある閉じたタグが存在する可能性があるため、うまく機能しない可能性があります。

を使用するとhtmlentities、該当するすべての文字< >がHTMLエンティティに変換され、リークの可能性がなくなります。

このアプローチには、利点や欠点、あるいは同じ結果を達成するためのより良い方法があるかもしれません。もしそうなら、私はそれらから学びたいのでコメントしてください:)


2
このコードは質問に答えることがありますが、問題を解決する方法理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
Alexander

1
そのようなhtmlentities()を使用している場合、<textarea>は冗長になります。divか何かに入れてください。OPは、PHPを使用していることをまったく示唆していませんでした。
Nick Rice

それは自動的に私たちが何かのdiv要素にそれを置く場合はそうでないスタイリング必要スクロールバーやものを追加するとしてよく、私の意見でテキストエリアが...自然のコンテナとして機能ええ@Nick
アヌパム

2

PHPのようなサーバー側言語を使用して、生のテキストを挿入できます。

<?php
  $str = <<<EOD
  <html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="description" content="Minimal HTML5">
    <meta name="keywords" content="HTML5,Minimal">
    <title>This is the title</title>
    <link rel='stylesheet.css' href='style.css'>
  </head>
  <body>
  </body>
  </html>
  EOD;
?>

次に、$strhtmlencoded の値をダンプします。

<div style="white-space: pre">
  <?php echo htmlentities($str); ?>
</div>

2

これは簡単なトリックで、SafariとFirefoxで試しました

<code>
    <span><</span>meta property="og:title" content="A very fine cuisine" /><br>
    <span><</span>meta property="og:image" content="http://www.example.com/image.png" />
</code>

次のように表示されます。

ここに画像の説明を入力してください

ここでライブ見ることができます


2

実際に、これを行う方法があります。これには制限(1つ)がありますが、100%標準であり、(xmpのように)非推奨ではなく、機能します。

そして、それは些細なことです。ここにあります:

<div id="mydoc-src" style="display: none;">
LlNnlljn77fggggkk77csJJK8bbJBKJBkjjjjbbbJJLJLLJo
<!--
YOUR CODE HERE.
    <script src="WidgetsLib/all.js"></script>
    ^^ This is a text, no side effects trying to load it.
-->
LlNnlljn77fggggkk77csJJK8bbJBKJBkjjjjbbbJJLJLLJo
</div>

説明させてください。まず、通常のHTMLコメントは、ブロック全体が解釈されるのを防ぐために機能します。タグを簡単に追加できます。それらはすべて無視されます。解釈からは無視されますが、innerHTML!残っているのは、内容を取得し、前後のコメントトークンをフィルター処理することです。

(少なくとも-制限)を除いて、(少なくとも私のChromeでは)コメントのネストはサポートされていないため、HTMLコメントを中に入れることはできません。最初に '->'を押すと、ショーが終了します。

まあ、それは厄介な小さな制限ですが、テキストにHTMLコメントがない場合は、まったく問題になりません。そして、1つの構成要素をエスケープしてから、それらの全体をエスケープする方が簡単です。

さて、その奇妙なLlNnlljn77fggggkk77csJJK8bbJBKJBkjjjjbbbJJLJLLJo文字列は何ですか?それはハッシュのようなランダムな文字列であり、ブロックで使用される可能性は低く、使用されますか?ここでは、コンテキスト、だ、なぜ私はそれを使用しているが。私の場合、1つのDIVのコンテンツを取得し、それをShowdownマークダウンで処理してから、出力を別のdivに割り当てました。アイデアは、HTMLファイルにインラインでマークダウンを記述し、ブラウザーで開くだけで、その場でロード時に変換されるというものでした。したがって、私の場合、<!--に変換され<p><!--</p>、コメントは適切にエスケープされました。動作しましたが、画面を汚染しました。したがって、正規表現で簡単に削除するには、ランダムな文字列を使用しました。これがコードです:

    var converter = new showdown.Converter();
    converter.setOption('simplifiedAutoLink', true);
    converter.setOption('tables', true);
    converter.setOption('tasklists', true);
    var src = document.getElementById("mydoc-src");
    var res = document.getElementById("mydoc-res");
    res.innerHTML = converter.makeHtml(src.innerHTML)
            .replace(/<p>.{0,10}LlNnlljn77fggggkk77csJJK8bbJBKJBkjjjjbbbJJLJLLJo.{0,10}<\/p>/g, "");
    src.innerHTML = '';

そしてそれは機能します。

誰かが興味があれば、この記事はこのテクニックを使って書かれています。気軽にダウンロードして、HTMLファイルを確認してください。

それはあなたがそれを何のために使っているかによります。ユーザー入力ですか?次にを使用して<textarea>、すべてをエスケープします。私の場合、そしておそらくあなたの場合もそうですが、私は単にコメントを使用し、それが仕事をします。

マークダウンを使用せず、タグからそのまま取得したい場合は、さらに簡単です。

<div id="mydoc-src" style="display: none;">
<!--
YOUR CODE HERE.
    <script src="WidgetsLib/all.js"></script>
    ^^ This is a text, no side effects trying to load it.
-->
</div>

それを取得するJavaScriptコード:

    var src = document.getElementById("mydoc-src");
    var YOUR_CODE = src.innerHTML.replace(/(<!--|-->)/g, "");

1

すべて脱出する方法はいくつかありますHTMLでますが、どれも良いません。

またはiframe、プレーンな古いテキストファイルをロードするを配置することもできます。


1

これはほとんどの状況で断然最良の方法です。

<pre><code>
    code here, escape it yourself.
</code></pre>

最初に提案した人に賛成票を投じたはずですが、評判はありません。インターネットで答えを見つけようとする人のために、私は何かを言わざるを得ませんでした。


1

これは私がそれをした方法です:

$str = file_get_contents("my-code-file.php");
echo "<textarea disabled='true' style='border: none;background-color:white;'>";
echo $str;
echo "</textarea>";

このコードはxssに対して脆弱です。誰でも$ str = "</
textarea

ヒヤ、これで問題はうまく解決できるかもしれません...しかし、どのようにそしてなぜそれが機能するかについて少し説明を提供できれば良いでしょう:)忘れないでください-スタックオーバーフローには初心者のヒープがあり、彼らは学ぶことができますあなたの専門知識からの1つか2つのこと-あなたにとって明白なことは彼らにとってそうではないかもしれません。
Taryn East 2014

1
function escapeHTML(string)
    { 
        var pre = document.createElement('pre');
        var text = document.createTextNode(string);
        pre.appendChild(text);
        return pre.innerHTML;
}//end escapeHTML

エスケープされたHTMLを返します



0

すべての状況で機能するとは限りませんが、コードスニペットを内に配置するtextareaと、コードとして表示されます。

実際のテキストエリアのように見せたくない場合は、CSSを使用してテキストエリアのスタイルを設定できます。


0

これは少しハックですが、次のようなものを使用できます。

body script {
    display: block;
    font-family: monospace;
    white-space: pre;
}
<script type="text/html">
<h1>Hello World</h1>

<ul>
    <li>Enjoy this dodgy hack,
    <li>or don't!
</ul>
</script>

そのCSSを使用すると、ブラウザーは本文内にスクリプトを表示します。タイプが不明なため、このスクリプトは実行されませんtext/html<script>終了</script>タグを含めない限り、内の特殊文字をエスケープする必要はありません。

私はこのようなものを使用して、ページの本文に実行可能なJavaScriptを表示します。これは、一種の「文芸的プログラミング」です。

この質問にはさらに多くの情報があります。


-1
 //To show xml tags in table columns you will have to encode the tags first

function htmlEncode(value) {
    //create a in-memory div, set it's inner text(which jQuery automatically encodes)
    //then grab the encoded contents back out.  The div never exists on the page.
    return $('<div/>').text(value).html();
}

html = htmlEncode(html)

-2

ここで一緒に働くいくつかの答えの組み合わせ:

function c(s) {
    return s.split("&lt;").join("<").split("&gt;").join(">").split("&amp;").join("&")
}

displayMe.innerHTML = ok.innerHTML;
console.log(
  c(ok.innerHTML)
)
<textarea style="display:none" id="ok">
<script>
console.log("hello", 5&9);
</script>
</textarea>
<div id="displayMe">

</div>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.