Показуйте фрагменти HTML у HTML


208

Як я можу показувати фрагменти HTML на веб-сторінці, не потребуючи заміни кожного <на &lt;і >на &gt;?

Іншими словами, чи існує тег для не візуалізації HTML, поки ви не натиснете на тег, що закривається ?

Відповіді:


95

Ні , немає. У правильному HTML-режимі неможливо уникнути деяких символів:

  • & як &amp;
  • < як &lt;

(До речі, втекти немає потреби > але люди часто роблять це з міркувань симетрії.)

І звичайно, ви повинні оточити отриманий, уникнутий HTML код в межах <pre><code>…</code></pre>(а) збереження пробілів та розривів рядків, і (b) позначити його як елемент коду.

Усі інші рішення, такі як введення коду в елемент <textarea>(або застарілий) <xmp>, будуть порушені . 1

XHTML , який оголошений в браузер в вигляді XML (через HTTP Content-Typeзаголовок - просто встановивши! DOCTYPEЦе мало ) в якості альтернативи може використовувати секцію CDATA:

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

Але це працює лише в XML, а не в HTML, і навіть це не є надійним рішенням, оскільки код не повинен містити розділювача закриття ]]>. Тож навіть у XML найпростіше, надійне рішення - це втеча.


1 Справа в точці:


Приємно. Так це частина стандарту HTML? Або він глибший, як частина стандарту xml?
aioobe

7
У HTML це відобразить `тут]]>`
Дельф

3
Так, це хороша відповідь, але не забудьте замінити >на &gt;
Алан

2
@Alan Я теж би це зробив, але насправді це не потрібно : лише <і &потрібно замінити, недисказований >дійсний у HTML.
Конрад Рудольф

1
@SamWatkins Але ваше рішення не простіше, ніж моє . Ви щойно змінили те, що вам потрібно уникнути, і ваше рішення, як ви визнаєте, є хакіті. Переваги робити це правильно немає буквально. Це вирішена проблема з правильним рішенням. Немає необхідності в хаках, якщо тільки вся ваша налаштування не зламається.
Конрад Рудольф

161

Перевірений і вірний метод для HTML:

  1. Замініть &персонаж на&amp;
  2. Замініть <персонаж на&lt;
  3. Замініть >персонаж на&gt;
  4. Необов'язково оточіть ваш зразок HTML за допомогою <pre>та / або <code>тегів.

17
Порада: Щоб пришвидшити заміну HTML-коду, ви можете використовувати Notepad ++ із розширенням 'TextFX'. Позначте текст, перейдіть до меню> TextFX> TextFX Convert> Encode HTML (& <> ") → Готово
Kai Noack

2
Чи існує яка-небудь існуюча бібліотека JavaScript, яка може це зробити будь-яким випадком?
Андерсон Грін

9
Це не дає відповіді на запитання, яке говорило "без потреби заміни ...". Крім того, заміна ">" зайва.
Jukka K. Korpela

2
І порядок теж важливий. Переконайтеся, що ви обробляєте &перше і <після.
Толга Євхімен

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

7
developer.mozilla.org/en-US/docs/Web/HTML/Element/xmp каже: " Не використовуйте цей елемент . Він був застарілий з HTML3.2 і не був реалізований послідовно. Він був повністю видалений з мова в HTML5. "
Нік Райс

50

Наївним способом відображення коду буде включення його в текстову область та додавання відключеного атрибуту, щоб його не можна редагувати.

<textarea disabled> code </textarea>

Сподіваємось, що допоможеш комусь, хто шукає простий спосіб зробити речі ..


7
Readonly може бути кращим атрибутом, ніж відключений, так що ви можете виділити текст всередині нього. Також можливо додавання стилю, який позбавляє його будь-яких функцій, що робить його схожим на вхідний елемент, хоча це є другорядним.
Таркін

2
Дивовижне рішення. Спасибі
Апіт Джон Ісмаїл

1
Ampersands все ще буде інтерпретуватися. наприклад, & nbsp; буде відображено як фактичний нерозривний простір. Але все ж гарна відповідь, що ідеально підходить для того, що я хочу зробити.
Нік Райс

1
Я перепробував багато способів, і це єдиний спосіб, який працює для мене. Дуже дякую.
Вільям Хоу

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. Єдине питання полягає в тому, що браузери додадуть цю маленьку ручку перетягування в правому нижньому куті, щоб змінити розмір поля. Або ж замість цього спробуйте використовувати тег введення.

Правильним способом введення коду у вашу текстову область є використання мови сервера на зразок цієї PHP, наприклад:

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

Потім він обходить інтерпретатор html і вводить неперетравований текст у текстову область послідовно у всіх браузерах.

Крім цього, єдиний спосіб - це справді уникнути коду, якщо статичний HTML або використовує серверні методи, такі як .NET's HtmlEncode (), якщо використовується така технологія.


1
це жахлива ідея. Що робити, якщо це було динамічне відображення html, а хтось робив наступне. <? php echo '</textarea> <script> попередження (\' привіт світ \ '); </script> <textarea>'; />. Тому ваш код вразливий до xss.
Гері Дроцелла

PHP є серверним, тому він не змінює результат, який бачить браузер. Особливо це не обходить інтерпретатор HTML.
Роберт Сімер

Мені подобається форматування textarea, щоб воно не виглядало як поле введення. Я також додаю ширину на 100%, щоб зменшити обгортання:<textarea disabled="true" style="border: none;background-color:white; width:100%">
Дан Кінг,

@GaryDrocella, якщо ви вставите теги <script> у тетарею, вони перетворюються на & lt; і & gt; автоматично, тому жоден сценарій ніколи не виконується
bluejayke


6

Це дуже просто .... Використовуйте цей xmp-код

    <xmp id="container">

&lt;xmp &gt;

    <p>a paragraph</p>

    &lt;/xmp &gt;

</xmp>

6

Я вважаю:

  • ви хочете написати 100% дійсний HTML5
  • ви хочете розмістити фрагмент коду (майже) літералу в HTML
    • особливо <не повинно потребувати втечі

Усі ваші варіанти є в цьому дереві:

  • з синтаксисом HTML
    • існує п’ять видів елементів
    • ті, що називаються "нормальними елементами" (наприклад <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>можуть бути зроблені помітними, а просто помістити їх усередині <body>з style="display: block; white-space: pre;"і type="text/html"або що - то , якщо ви не хочете, щоб це було виконано в JavaScript. Думаю, це приємний трюк, гарний для грамотного програмування та викладання. Також <xmp>досі реалізується в основних браузерах, хоча це застаріло.
Сем Уоткінс

Цікаво. @SamWatkins <xmp>недійсний HTML5, але ваш інший трюк виглядає належним чином!
Роберт Сімер

5

Якщо ваша мета - показати шматок коду, який ви виконуєте в іншому місці на одній сторінці, ви можете використовувати textContent (це чисто-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;" на цільовому діві та запишіть рядки окремо, використовуючи "\ r \ n" в кінці кожного.

Ось демонстрація: https://jsfiddle.net/wphps3od/

Цей метод має перевагу перед використанням textarea: код не буде переформатований так, як у текстовій області. (Такі &nbsp;речі видаляються повністю в текстовій області)


Це дуже приємний підхід, щоб використовувати JavaScript та DOM API, щоб зробити це втечею для нас. Ми можемо використовувати його разом із тим <template>чи іншим, що зазвичай не відображається.
Сем Уоткінс

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
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як і чому він вирішує проблему, покращить довгострокове значення відповіді.
Олександр

1
Якщо ви використовуєте htmlentities () подібним чином, <textarea> стає зайвим. Просто покладіть його в дів чи щось. ОП не припускає, що вони взагалі використовують PHP.
Нік Райс

@ Ні, так, на мою думку, textarea служить природним контейнером, оскільки він автоматично додаватиме смуги прокрутки та речі, які в іншому випадку потребують стилізації, якщо ми помістимо його в
Анупам

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;
?>

потім $strскидаємо значення htmlencoded:

<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

Насправді є спосіб це зробити. Він має обмеження (один), але є 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 ! Отже, що залишається - це отримати вміст і відфільтрувати попередні та останні маркери коментарів.

За винятком (пам’ятайте - обмеження) ви не можете розміщувати там коментарі HTML, оскільки (принаймні, в моєму Chrome) вкладення їх не підтримується, і найперше '->' закінчить показ.

Ну, це невелике обмеження, але в деяких випадках це зовсім не проблема, якщо ваш текст не містить коментарів HTML. І, легше врятуватися однією конструкцією, а потім цілою купу їх.

Тепер, що це за дивна LlNnlljn77fggggkk77csJJK8bbJBKJBkjjjjbbbJJLJLLJoструна? Це випадкова рядок, як хеш, навряд чи буде використовуватися в блоці, і використовується для? Ось контекст, чому я його використав. У моєму випадку я взяв вміст одного DIV, потім обробив його з відміткою Showdown, а потім вихід, призначений в інший div. Ідея полягала в тому, щоб записати розмітку inline у ​​файл 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> <textarea>"
Гері Дроцелла

Привіт, це цілком може вирішити проблему ... але було б добре, якщо ви могли б дати трохи пояснень про те, як і чому це працює :) Не забудьте - на переливі Stack є купа новачків, і вони могли б навчитися річ чи дві з вашого досвіду - те, що вам очевидно, може бути не таким для них.
Taryn East

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, якщо ви не хочете, щоб він виглядав як фактичний textarea.


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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.