Есть ли функция или пример для преобразования строки html в обычный текст без тегов html с помощью скрипта Google Apps?

В JavaScript это решение выполнит эту работу:

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

Однако, насколько мне известно, документ недоступен в Google Apps Script. Есть ли другая альтернатива анализу и отображению простого текста из html в скрипте Google Apps?

Я пытался использовать

HtmlService.createHtmlOutput('<b>Hello, world!</b>').getContent();

Однако это просто отображает текст со всеми тегами.

Я ожидаю, что вклад

'<b>Hello, world!</b>'

Будет ли вывод

'Hello, world!'
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 510
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

HTML-теги можно удалить двумя способами:

  1. RegExp — регулярное выражение
  2. Преобразование HTML в XML с использованием XmlService для получения каждого элемента, а затем получения значения каждого элемента

Reg Exp лучше, потому что вам не нужно находить каждый элемент HTML, что требует намного больше кода.

HTML необходимо сначала преобразовать в XML, чтобы можно было использовать XmlService.getPrettyFormat(). Если бы теги html были сначала удалены с помощью регулярного выражения, тогда код не знал бы, где должны быть разрывы строк.

Использование XmlService.getPrettyFormat() отформатирует html с разрывами строк. Но чтобы использовать XmlService, строку html необходимо сначала преобразовать в XML. И есть пара вещей, которые вам нужно сделать при преобразовании строки html в XML, чтобы избежать ошибок.

function parseHtml() {

  var html = 'This is just a Test<br><br>Here is my List<br>\
    <ol><li>one</li><li>Two</li><li>Three</li></ol><br>And a bulleted one<br><ul>\
    <li>Bullet One</li><li>Bullet Two</li><li>Bullet Three</li></ul>'; 

  html = '<div>' + html + '</div>';//To avoid the "Content is not allowed in prolog." error
  html = html.replace(/<br>/g,"");//To avoid an error when parsing to xml
  //Logger.log('html: ' + html)

  var document = XmlService.parse(html);

  var output = XmlService.getPrettyFormat().format(document);
  //Logger.log(output);

  output = output.replace(/<[^>]*>/g,"");
  Logger.log(output)
}

Другой способ сделать это, который приведен только в качестве учебного примера, — проанализировать HTML как Xml с помощью XmlService, а затем пройтись по всем элементам. Следующий код проходит только через пару слоев дочерних элементов.

function parseHtml() {

  var html = 'This is just a Test<br><br>Here is my List<br>\
    <ol><li>one</li><li>Two</li><li>Three</li></ol><br>And a bulleted one<br><ul>\
    <li>Bullet One</li><li>Bullet Two</li><li>Bullet Three</li></ul>'; 

  html = '<div>' + html + '</div>';
  html = html.replace(/<br>/g,"");
  //Logger.log('html: ' + html)

  var allText = "";
  var thisTxt;

  var document = XmlService.parse(html);
  var root = document.getRootElement();
  //Logger.log('root: ' + JSON.stringify(root))

  var content = root.getAllContent();
  //Logger.log('content: ' + JSON.stringify(content))

  var L = content.length;

  for (var i=0;i<L;i++) {
    var thisEl = content[i];
    if (!thisEl) {continue;}

    var theType = thisEl.getType();
    //Logger.log('theType: ' + theType)
    //Logger.log('typeof theType: ' + typeof theType)

    if (theType === theType.ELEMENT) {
      var asElmt = thisEl.asElement();
      var allChildren = asElmt.getChildren();

      if (allChildren) {
        var nmbrOfChildren = allChildren.length;
        //Logger.log('nmbrOfChildren: ' + nmbrOfChildren)
      }

      if (!nmbrOfChildren) {
        thisTxt = asElmt.getValue();

        //Logger.log('thisTxt 43: ' + thisTxt)
        allText = allText + thisTxt  + "\n";
        continue;
      }

      for (var j=0;j<nmbrOfChildren;j++) {

        thisTxt = allChildren[j].getValue();
        if (!thisTxt) {
          continue;
        }

        allText = allText + thisTxt + "\n";

      }
      continue;
    }

    //Logger.log(thisEl.getValue())   
    allText = allText + thisEl.getValue()  + "\n";

  }

  //Logger.log('allText: ' + allText + "\n")

}

Я получаю «Содержимое не разрешено в прологе». когда я пробую это с html, который содержит упорядоченный список. function ParseHtml() { var html = 'Это всего лишь тест<br><br>Вот мой список<br><ol><li>один</li><li>два</li><li>три </li></ol><br>А‌​и маркированный<br><ul><li>Первый маркер</li><li>Пучок второй</li><li>Третий маркер</li> </ul>'; var document = XmlService.parse(html);//Создает документ XML var root = document.getRootElement();//Получает узел корневого элемента документа var text = root.getText();//Получает текстовое значение элемента узел элемента Logger.log('текст: ' + текст) }

George Duke 19.07.2019 23:57

«Содержимое не разрешено в прологе». Ошибка связана с тем, что первая часть содержимого: «Это всего лишь тест» не заключена в начальный и конечный теги. Вы также должны заменить все теги <br>, потому что у них нет завершающего тега: html = "<div>" + html + "</div>"; html = html.replace(/<br>/g,"");Logger.log("html:" + html) Вам нужно сделать еще кое-что, но это только начало. Возможно, вы захотите обновить исходный вопрос, добавив тестовый код.

Alan Wells 20.07.2019 00:25
XmlService.getPrettyFormat() может быть проще.
TheMaster 20.07.2019 13:02

Я только что попробовал var output = XmlService.getPrettyFormat().format(document);Logger.log(out‌​put);, но он не удаляет теги HTML, о чем и был задан вопрос. Но это отличный способ убрать отступы и отформатировать разрывы строк. Есть ли лучший способ удалить теги html?

Alan Wells 20.07.2019 14:49

Понимаю. Я сначала не тестил. После тестирования я думаю, что мы можем использовать регулярное выражение: Logger.log(output.replace(/<[^>]*>/g,"")); после формата

TheMaster 20.07.2019 19:26

Я обновил ответ кодом, в котором используется комбинация XmlService и регулярного выражения.

Alan Wells 20.07.2019 21:26

Другие вопросы по теме