Как загрузить PRE-теги из PHP / HTML в виде текстового файла? [Дубликат]

В то время как обещания и обратные вызовы хорошо работают во многих ситуациях, боль в задней части выражает нечто вроде:

if (!name) {
  name = async1();
}
async2(name);

. В итоге вы пройдете через async1; проверьте, не определено ли name или нет, и соответственно вызовите обратный вызов.

async1(name, callback) {
  if (name)
    callback(name)
  else {
    doSomething(callback)
  }
}

async1(name, async2)

Хотя в в порядке хорошо , это раздражает, когда у вас много подобных случаев и обработка ошибок.

Fibers помогает в решении проблемы.

var Fiber = require('fibers')

function async1(container) {
  var current = Fiber.current
  var result
  doSomething(function(name) {
    result = name
    fiber.run()
  })
  Fiber.yield()
  return result
}

Fiber(function() {
  var name
  if (!name) {
    name = async1()
  }
  async2(name)
  // Make any number of async calls from here
}

Вы можете проверить проект здесь .

504
задан Gideon 25 May 2015 в 03:54
поделиться

30 ответов

Если вы работаете в браузере, то самым простым способом является только , чтобы браузер сделал это для вас ...

function strip(html)
{
   var tmp = document.createElement("DIV");
   tmp.innerHTML = html;
   return tmp.textContent || tmp.innerText || "";
}

Примечание: как люди отметили в комментариях, этого лучше избегать, если вы не контролируете источник HTML (например, не запускайте его ни на что, что могло бы произойти с пользовательского ввода). Для этих сценариев вы можете еще позволить браузеру выполнить эту работу для вас - см. Ответ Saba об использовании широко доступного DOMParser .

628
ответ дан Shog9 5 September 2018 в 09:03
поделиться
function stripHTML(my_string){
    var charArr   = my_string.split(''),
        resultArr = [],
        htmlZone  = 0,
        quoteZone = 0;
    for( x=0; x < charArr.length; x++ ){
     switch( charArr[x] + htmlZone + quoteZone ){
       case "<00" : htmlZone  = 1;break;
       case ">10" : htmlZone  = 0;resultArr.push(' ');break;
       case '"10' : quoteZone = 1;break;
       case "'10" : quoteZone = 2;break;
       case '"11' : 
       case "'12" : quoteZone = 0;break;
       default    : if(!htmlZone){ resultArr.push(charArr[x]); }
     }
    }
    return resultArr.join('');
}

Учет для> внутренних атрибутов и <img onerror="javascript"> во вновь созданных элементах дома.

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

clean_string = stripHTML("string with <html> in it")

demo:

https://jsfiddle.net/gaby_de_wilde/pqayphzd/

demo верхнего ответа, делающего ужасные вещи:

https: // jsfiddle. сеть / gaby_de_wilde / 6f0jymL6 / 1 /

4
ответ дан 3 revs, 2 users 91% 5 September 2018 в 09:03
поделиться

Для escape-символов это также будет работать с использованием сопоставления с образцом:

myString.replace(/((&lt)|(<)(?:.|\n)*?(&gt)|(>))/gm, '');
0
ответ дан Abhishek Dhanraj Shahdeo 5 September 2018 в 09:03
поделиться

Ниже кода вы можете сохранить некоторые 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
ответ дан aWebDeveloper 5 September 2018 в 09:03
поделиться

Принимаемый ответ работает отлично, однако в 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
ответ дан basarat 5 September 2018 в 09:03
поделиться

Другим, по общему признанию, менее элегантным решением, чем nickf или Shog9, было бы рекурсивно ходить DOM, начиная с & lt; body & gt; тег и добавьте каждый текстовый узел.

var bodyContent = document.getElementsByTagName('body')[0];
var result = appendTextNodes(bodyContent);

function appendTextNodes(element) {
    var text = '';

    // Loop through the childNodes of the passed in element
    for (var i = 0, len = element.childNodes.length; i < len; i++) {
        // Get a reference to the current child
        var node = element.childNodes[i];
        // Append the node's value if it's a text node
        if (node.nodeType == 3) {
            text += node.nodeValue;
        }
        // Recurse through the node's children, if there are any
        if (node.childNodes.length > 0) {
            appendTextNodes(node);
        }
    }
    // Return the final result
    return text;
}
7
ответ дан Bryan 5 September 2018 в 09:03
поделиться

Я думаю, что самый простой способ - просто использовать регулярные выражения как кто-то, упомянутый выше. Хотя нет причин использовать их. Попробуйте:

stringWithHTML = stringWithHTML.replace(/<\/?[a-z][a-z0-9]*[^<>]*>/ig, "");
2
ответ дан Byron Carasco 5 September 2018 в 09:03
поделиться

Я изменил ответ Jibberboy2000 , чтобы включить несколько форматов тегов <BR />, удалить все внутри тегов <SCRIPT> и <STYLE>, отформатировать полученный HTML, удалив несколько разрывов строк и пробелов и конвертировать некоторые HTML -кодированный код в нормальный. После некоторого тестирования кажется, что вы можете конвертировать большую часть полных веб-страниц в простой текст, где сохраняются заголовок и содержимое страницы.

В простом примере

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<!--comment-->

<head>

<title>This is my title</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>

    body {margin-top: 15px;}
    a { color: #D80C1F; font-weight:bold; text-decoration:none; }

</style>
</head>

<body>
    <center>
        This string has <i>html</i> code i want to <b>remove</b><br>
        In this line <a href="http://www.bbc.co.uk">BBC</a> with link is mentioned.<br/>Now back to &quot;normal text&quot; and stuff using &lt;html encoding&gt;                 
    </center>
</body>
</html>

становится

Это мой заголовок

Эта строка содержит html-код, который я хочу удалить

В этой строке BBC ( http://www.bbc .co.uk ) со ссылкой.

Теперь вернемся к «нормальному тексту» и т. д., используя

Функция JavaScript и тестовая страница выглядят так :

function convertHtmlToText() {
    var inputText = document.getElementById("input").value;
    var returnText = "" + inputText;

    //-- remove BR tags and replace them with line break
    returnText=returnText.replace(/<br>/gi, "\n");
    returnText=returnText.replace(/<br\s\/>/gi, "\n");
    returnText=returnText.replace(/<br\/>/gi, "\n");

    //-- remove P and A tags but preserve what's inside of them
    returnText=returnText.replace(/<p.*>/gi, "\n");
    returnText=returnText.replace(/<a.*href="(.*?)".*>(.*?)<\/a>/gi, " $2 ($1)");

    //-- remove all inside SCRIPT and STYLE tags
    returnText=returnText.replace(/<script.*>[\w\W]{1,}(.*?)[\w\W]{1,}<\/script>/gi, "");
    returnText=returnText.replace(/<style.*>[\w\W]{1,}(.*?)[\w\W]{1,}<\/style>/gi, "");
    //-- remove all else
    returnText=returnText.replace(/<(?:.|\s)*?>/g, "");

    //-- get rid of more than 2 multiple line breaks:
    returnText=returnText.replace(/(?:(?:\r\n|\r|\n)\s*){2,}/gim, "\n\n");

    //-- get rid of more than 2 spaces:
    returnText = returnText.replace(/ +(?= )/g,'');

    //-- get rid of html-encoded characters:
    returnText=returnText.replace(/&nbsp;/gi," ");
    returnText=returnText.replace(/&amp;/gi,"&");
    returnText=returnText.replace(/&quot;/gi,'"');
    returnText=returnText.replace(/&lt;/gi,'<');
    returnText=returnText.replace(/&gt;/gi,'>');

    //-- return
    document.getElementById("output").value = returnText;
}

Он использовался с этим HTML:

<textarea id="input" style="width: 400px; height: 300px;"></textarea><br />
<button onclick="convertHtmlToText()">CONVERT</button><br />
<textarea id="output" style="width: 400px; height: 300px;"></textarea><br />
224
ответ дан Community 5 September 2018 в 09:03
поделиться

После того, как все ответы были упомянуты чаще всего, если не все из них имели краевые случаи и не могли полностью поддержать мои потребности.

Я начал изучать, как это делает php, и наткнулся на php.js lib который реплицирует метод strip_tags здесь: http://phpjs.org/functions/strip_tags/

4
ответ дан Deminetix 5 September 2018 в 09:03
поделиться

простой 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
ответ дан Developer 5 September 2018 в 09:03
поделиться

Вы можете безопасно скрыть теги html с помощью атрибута iframe sandbox .

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

Самый подходящий элемент, в который нужно добавить наш текст, представляет собой изолированный iframe, так что мы можем (g1] 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 || "";
  };
})();

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

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
ответ дан Etienne Martin 5 September 2018 в 09:03
поделиться

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

Это кажется отличным.

htmlContent= htmlContent.replace(/<a.*href="(.*?)">/g, '');
htmlContent= htmlContent.replace(/<\/a>/g, '');
2
ответ дан FrigginGlorious 5 September 2018 в 09:03
поделиться

Если вы хотите сохранить ссылки и структуру содержимого (h1, h2 и т. д.), вы должны проверить TextVersionJS . Вы можете использовать его с любым HTML, хотя он был создан для преобразования HTML-письмо в обычный текст.

Использование очень простое. Например, в node.js:

var createTextVersion = require("textversionjs");
var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";

var textVersion = createTextVersion(yourHtml);

Или в браузере с чистым js:

<script src="textversion.js"></script>
<script>
  var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";
  var textVersion = createTextVersion(yourHtml);
</script>

Он также работает с require.js:

define(["textversionjs"], function(createTextVersion) {
  var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";
  var textVersion = createTextVersion(yourHtml);
});
5
ответ дан gyula.nemeth 5 September 2018 в 09:03
поделиться

Многие уже ответили на это, но я подумал, что было бы полезно разделить функцию, которую я написал, которая разбивает теги HTML из строки, но позволяет включать массив тегов, которые вы не хотите удалять. Это довольно коротко и прекрасно работает для меня.

function removeTags(string, array){
  return array ? string.split("<").filter(function(val){ return f(array, val); }).map(function(val){ return f(array, val); }).join("") : string.split("<").map(function(d){ return d.split(">").pop(); }).join("");
  function f(array, value){
    return array.map(function(d){ return value.includes(d + ">"); }).indexOf(true) != -1 ? "<" + value : value.split(">")[1];
  }
}

var x = "<span><i>Hello</i> <b>world</b>!</span>";
console.log(removeTags(x)); // Hello world!
console.log(removeTags(x, ["span", "i"])); // <span><i>Hello</i> world!</span>
4
ответ дан Harry Stevens 5 September 2018 в 09:03
поделиться
var text = html.replace(/<\/?("[^"]*"|'[^']*'|[^>])*(>|$)/g, "");

Это версия регулярного выражения, которая более устойчива к искаженному HTML, например:

Незаблокированные теги

Some text <img

"& lt; lt ; ","> "внутри атрибутов тегов

Some text <img alt="x > y">

Newlines

Some <a href="http://google.com">

Код

var html = '<br>This <img alt="a>b" \r\n src="a_b.gif" />is > \nmy<>< > <a>"text"</a'
var text = html.replace(/<\/?("[^"]*"|'[^']*'|[^>])*(>|$)/g, "");
1
ответ дан hegemon 5 September 2018 в 09:03
поделиться

С помощью jQuery вы можете просто получить его с помощью

$('#elementID').text()
2
ответ дан ianaz 5 September 2018 в 09:03
поделиться

Улучшение более раннего ответа.

function strip(html)
{
   var tmp = document.implementation.createHTMLDocument("New").body;
   tmp.innerHTML = html;
   return tmp.textContent || tmp.innerText || "";
}

Таким образом, что-то работает как это, не повредит:

strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")

Firefox, Chromium и Explorer 9+ безопасны , Opera Presto по-прежнему уязвима. Также изображения, упомянутые в строках, не загружаются в Chromium и Firefox, сохраняя HTTP-запросы.

26
ответ дан Janghou 5 September 2018 в 09:03
поделиться

Я внесла некоторые изменения в оригинальный сценарий Jibberboy2000. Надеюсь, что это будет полезно кому-то

str = '**ANY HTML CONTENT HERE**';

str=str.replace(/<\s*br\/*>/gi, "\n");
str=str.replace(/<\s*a.*href="(.*?)".*>(.*?)<\/a>/gi, " $2 (Link->$1) ");
str=str.replace(/<\s*\/*.+?>/ig, "\n");
str=str.replace(/ {2,}/gi, " ");
str=str.replace(/\n+\s*/gi, "\n\n");
3
ответ дан Jaxolotl 5 September 2018 в 09:03
поделиться

Вот версия, которая сортирует адреса @ Проблемы с безопасностью MikeSamuel:

function strip(html)
{
   try {
       var doc = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null);
       doc.documentElement.innerHTML = html;
       return doc.documentElement.textContent||doc.documentElement.innerText;
   } catch(e) {
       return "";
   }
}

Обратите внимание: она вернет пустую строку, если HTML-разметка недействительна XML (иначе, теги должны быть закрыты и атрибуты должны быть указаны). Это не идеально, но позволяет избежать проблемы с потенциальным эксплойтом безопасности.

Если вам не нужна действительная разметка XML, вы можете попробовать:

var doc = document.implementation.createHTMLDocument("");

, но это не идеальное решение ни по другим причинам.

3
ответ дан Jeremy Johnstone 5 September 2018 в 09:03
поделиться

Также можно использовать фантастический htmlparser2 чистый JS HTML-парсер. Вот рабочая демонстрация:

var htmlparser = require('htmlparser2');

var body = '<p><div>This is </div>a <span>simple </span> <img src="test"></img>example.</p>';

var result = [];

var parser = new htmlparser.Parser({
    ontext: function(text){
        result.push(text);
    }
}, {decodeEntities: true});

parser.write(body);
parser.end();

result.join('');

Выход будет This is a simple example.

Смотрите здесь: https://tonicdev.com/jfahrenkrug/extract -text-from-html

Это работает как в узле, так и в браузере, если вы упаковываете свое веб-приложение с помощью такого инструмента, как webpack.

2
ответ дан Johannes Fahrenkrug 5 September 2018 в 09:03
поделиться

Это должно работать над любой средой Javascript (включая NodeJS). text.replace(/<[^>]+>/g, '');

14
ответ дан Karl.S 5 September 2018 в 09:03
поделиться

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

str=str.replace(/(<\?[a-z]*(\s[^>]*)?\?(>|$)|<!\[[a-z]*\[|\]\]>|<!DOCTYPE[^>]*?(>|$)|<!--[\s\S]*?(-->|$)|<[a-z?!\/]([a-z0-9_:.])*(\s[^>]*)?(>|$))/gi, ''); 
1
ответ дан MarekJ47 5 September 2018 в 09:03
поделиться

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

function stripTags() {
    return $('<p></p>').html(textToEscape).text()
}
1
ответ дан math2001 5 September 2018 в 09:03
поделиться

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;
}
0
ответ дан Mike 5 September 2018 в 09:03
поделиться
myString.replace(/<(?:.|\n)*?>/gm, '');
428
ответ дан nickf 5 September 2018 в 09:03
поделиться

Я хотел бы поделиться отредактированной версией одобренного ответа Shog9 .


Как указал Майк Самуэль с комментарием, эта функция может выполнять встроенные коды javascript. Но Shog9 прав, говоря «пусть браузер сделает это за вас ...»

, поэтому здесь моя отредактированная версия, используя DOMParser :

function strip(html){
   var doc = new DOMParser().parseFromString(html, 'text/html');
   return doc.body.textContent || "";
}

здесь код для проверки встроенного javascript:

strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")

Кроме того, он не запрашивает ресурсы для разбора (например, изображения)

strip("Just text <img src='https://assets.rbl.ms/4155638/980x.jpg'>")
40
ответ дан Saba 5 September 2018 в 09:03
поделиться
    (function($){
        $.html2text = function(html) {
            if($('#scratch_pad').length === 0) {
                $('<div id="lh_scratch"></div>').appendTo('body');  
            }
            return $('#scratch_pad').html(html).text();
        };

    })(jQuery);

Определите это как плагин jquery и используйте его следующим образом:

$.html2text(htmlContent);
0
ответ дан Shiv Shankar 5 September 2018 в 09:03
поделиться

Как расширение метода jQuery, если ваша строка может не соответствовать HTML (например, если вы пытаетесь удалить HTML из поля формы)

jQuery(html).text();

будет верните пустую строку, если нет html

Вместо этого:

jQuery('<p>' + html + '</p>').text();

.

Обновление: как указано в некоторых случаях это решение будет выполнять javascript, содержащийся в html, если на значение html может повлиять атакующий, используйте другое решение.

49
ответ дан user999305 5 September 2018 в 09:03
поделиться

Преобразование HTML для простого текстового письма с сохранением гиперссылок (href) intact

Вышеупомянутая функция, опубликованная hypoxy, отлично работает, но я был после чего-то, что в основном конвертирует HTML, созданный в редакторе Web RichText (для например, FCKEditor) и очистить все HTML, но оставить все ссылки за то, что я хотел, чтобы и HTML, и версия обычного текста помогли создать правильные части для электронной почты STMP (как HTML, так и обычного текста).

После долгого времени поиска Google я и мои коллеги придумали это с использованием механизма регулярных выражений в Javascript:

str='this string has <i>html</i> code i want to <b>remove</b><br>Link Number 1 -><a href="http://www.bbc.co.uk">BBC</a> Link Number 1<br><p>Now back to normal text and stuff</p>
';
str=str.replace(/<br>/gi, "\n");
str=str.replace(/<p.*>/gi, "\n");
str=str.replace(/<a.*href="(.*?)".*>(.*?)<\/a>/gi, " $2 (Link->$1) ");
str=str.replace(/<(?:.|\s)*?>/g, "");

переменная str запускается следующим образом:

this string has <i>html</i> code i want to <b>remove</b><br>Link Number 1 -><a href="http://www.bbc.co.uk">BBC</a> Link Number 1<br><p>Now back to normal text and stuff</p>

, а затем после запуска кода выглядит так: -

this string has html code i want to remove
Link Number 1 -> BBC (Link->http://www.bbc.co.uk)  Link Number 1


Now back to normal text and stuff

Как вы можете видеть, все HTML-файлы были удалены, и ссылка была сохранена с гиперссылкой текста по-прежнему неповрежденными. Также я заменил теги <p> и <br> на \n (символ новой строки), чтобы сохранилось какое-то визуальное форматирование.

Чтобы изменить формат ссылки (например, BBC (Link->http://www.bbc.co.uk) ) просто отредактируйте $2 (Link->$1), где $1 - URL-адрес / URL-адрес href, а $2 - гиперссылнный текст. С помощью ссылок непосредственно в теле обычного текста большинство SMTP Mail Clients преобразуют их, поэтому пользователь имеет возможность нажимать на них.

Надеюсь, вы найдете это полезным.

35
ответ дан Victor 5 September 2018 в 09:03
поделиться

Самый простой способ:

jQuery(html).text();

Получает весь текст из строки html.

224
ответ дан Community 5 September 2018 в 09:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: