Убрать HTML из текстового JavaScript - PullRequest
562 голосов
/ 05 мая 2009

Есть ли простой способ взять строку html в JavaScript и убрать html?

Ответы [ 34 ]

2 голосов
/ 19 августа 2013

Мне просто нужно было удалить теги <a> и заменить их текстом ссылки.

Кажется, это прекрасно работает.

htmlContent= htmlContent.replace(/<a.*href="(.*?)">/g, '');
htmlContent= htmlContent.replace(/<\/a>/g, '');
2 голосов
/ 14 июля 2015

Код ниже позволяет вам сохранить некоторые HTML-теги, удаляя все остальные

function strip_tags(input, allowed) {

  allowed = (((allowed || '') + '')
    .toLowerCase()
    .match(/<[a-z][a-z0-9]*>/g) || [])
    .join(''); // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>)

  var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
      commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;

  return input.replace(commentsAndPhpTags, '')
      .replace(tags, function($0, $1) {
          return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
      });
}
2 голосов
/ 04 апреля 2018

Вы можете безопасно удалять теги html, используя атрибут песочницы iframe .

Идея в том, что вместо того, чтобы пытаться пересмотреть нашу строку, мы используем преимущества встроенного в браузер синтаксического анализатора, вставляя текст в элемент DOM и затем запрашивая свойство textContent / innerText этого элемента. *

Наилучшим подходящим элементом для вставки нашего текста является встроенная программа-песочница, таким образом мы можем предотвратить любое выполнение произвольного кода (также известный как XSS ).

Недостатком этого подхода является то, что он работает только в браузерах.

Вот что я придумала (не проверено в бою):

const stripHtmlTags = (() => {
  const sandbox = document.createElement("iframe");
  sandbox.sandbox = "allow-same-origin"; // <--- This is the key
  sandbox.style.setProperty("display", "none", "important");

  // Inject the sanbox in the current document
  document.body.appendChild(sandbox);

  // Get the sandbox's context
  const sanboxContext = sandbox.contentWindow.document;

  return (untrustedString) => {
    if (typeof untrustedString !== "string") return ""; 

    // Write the untrusted string in the iframe's body
    sanboxContext.open();
    sanboxContext.write(untrustedString);
    sanboxContext.close();

    // Get the string without html
    return sanboxContext.body.textContent || sanboxContext.body.innerText || "";
  };
})();

Использование ( демо ):

console.log(stripHtmlTags(`<img onerror='alert("could run arbitrary JS here")' src='bogus'>XSS injection :)`));
console.log(stripHtmlTags(`<script>alert("awdawd");</` + `script>Script tag injection :)`));
console.log(stripHtmlTags(`<strong>I am bold text</strong>`));
console.log(stripHtmlTags(`<html>I'm a HTML tag</html>`));
console.log(stripHtmlTags(`<body>I'm a body tag</body>`));
console.log(stripHtmlTags(`<head>I'm a head tag</head>`));
console.log(stripHtmlTags(null));
1 голос
/ 14 июня 2017

input элемент поддерживает только одну строку текста :

Текстовое состояние представляет собой однострочный текстовый элемент управления для редактирования значения элемента.

function stripHtml(str) {
  var tmp = document.createElement('input');
  tmp.value = str;
  return tmp.value;
}

Обновление: работает как положено

function stripHtml(str) {
  // Remove some tags
  str = str.replace(/<[^>]+>/gim, '');

  // Remove BB code
  str = str.replace(/\[(\w+)[^\]]*](.*?)\[\/\1]/g, '$2 ');

  // Remove html and line breaks
  const div = document.createElement('div');
  div.innerHTML = str;

  const input = document.createElement('input');
  input.value = div.textContent || div.innerText || '';

  return input.value;
}
1 голос
/ 09 ноября 2012

Я сам создал рабочее регулярное выражение:

str=str.replace(/(<\?[a-z]*(\s[^>]*)?\?(>|$)|<!\[[a-z]*\[|\]\]>|<!DOCTYPE[^>]*?(>|$)|<!--[\s\S]*?(-->|$)|<[a-z?!\/]([a-z0-9_:.])*(\s[^>]*)?(>|$))/gi, ''); 
1 голос
/ 05 июля 2013

простой 2-строчный jquery для удаления HTML.

 var content = "<p>checking the html source&nbsp;</p><p>&nbsp;
  </p><p>with&nbsp;</p><p>all</p><p>the html&nbsp;</p><p>content</p>";

 var text = $(content).text();//It gets you the plain text
 console.log(text);//check the data in your console

 cj("#text_area_id").val(text);//set your content to text area using text_area_id
1 голос
/ 27 мая 2016

Принятый ответ в основном работает нормально, однако в IE, если строка html равна null, вы получите "null" (вместо ''). Исправлено:

function strip(html)
{
   if (html == null) return "";
   var tmp = document.createElement("DIV");
   tmp.innerHTML = html;
   return tmp.textContent || tmp.innerText || "";
}
1 голос
/ 09 декабря 2016

Использование Jquery:

function stripTags() {
    return $('<p></p>').html(textToEscape).text()
}
0 голосов
/ 25 марта 2019

Более безопасный способ вырезать html с помощью jQuery - это сначала использовать jQuery.parseHTML для создания DOM, игнорируя любые сценарии, прежде чем позволить jQuery создать элемент, а затем извлечь только текст.

function stripHtml(unsafe) {
    return $($.parseHTML(unsafe)).text();
}

Может безопасно удалить HTML из:

<img src="unknown.gif" onerror="console.log('running injections');">

и другие подвиги.

NJoy!

0 голосов
/ 09 февраля 2019

https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML

var div = document.getElementsByTagName('div');
for (var i=0; i<div.length; i++) {
    div[i].insertAdjacentHTML('afterend', div[i].innerHTML);
    document.body.removeChild(div[i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...