Использование модификаторов регулярных выражений в Google Аппс Скрипт

Я хочу получить код между этикетками form от веб-страницы используя Google Аппс Скрипт, для чего я использую match с регулярным выражением /<form(.*?)<\/form>/g

function test() {
  var html = UrlFetchApp.fetch('https://docs.google.com/forms/d/1awKpg_diniayS6360kNXrcgihk36azQ3DJEaZqXDY7A/viewform?embedded=true').getContentText();
  var form = html.match(/<form(.*?)<\/form>/g);
  Logger.log(form);
}

Я пробовал несмотря на то, что заменяю модификатор g из-за других модификаторов как m и s но редактор Google Аппс Скрипт не принимает их.

Возможно использовать эти модификаторы? Как?

4
задан 21.07.2017, 07:31
3 ответа

regex, который ты используешь, не встречается с form, потому что в .*?, точка совпадает с любым характером меньше разрывов линии. Относительно твоего вопроса, модификаторы /g и /m они не имеют ничего общего с этим поведением. /g он способствует тому, чтобы они возвратили себе все совпадения, и /m измени поведение ^ и $ исключительно.

Я показываю 2 метода, чтобы получать все forms HTML: форма, которую я считаю правильной, и потом, как было бы возможно делать с regex (не такой заслуживающий доверия, но значительно более работоспособный и менее опасный, который использовать [\s\S]* для contendido этикетки).



Метод 1: Соглашаясь на DOM (правильный способ это делать)

С XMLService мы можем использовать DOM (Документ Обхект Model), что позволяет выбирать все tags <form> присутствующие в документе.

У XMLService есть метод .parse() чтобы обрабатывать такой плоский структурированный string как документ XML. Однако, он не ни для чего позволяющий. Только прими действительного XML и структурированное добро (что-то, что почти никакая веб-страница выполняет). И, это, чтобы нам удается обработать, мы можем реализовывать "прием". Более старая версия XMLService, услуга XML, гораздо более снисходительная и принимает общий HTML, превращая это в действительного XML. Так, однажды обвиняемый, мы можем перемещать это XMLService. Плохое известие: XML устаревший и не известен как долго он продолжит быть доступным. Но пока функционируй.

Эта форма безопасная и в доказательство неудач, так как любая проблема с HTML, была бы обнаружена после XML.parse(), предотвращая неправильный вывод текста.

function doGet() {
  // En vez de obtener el html con UrlFetchApp.fetch(), se usa esto a modo de ejemplo
  var html = '<html>'
           + '  <body>'
           + '    <p>Texto a borrar</p>'
           + '    <form>'
           + '      <input type="radio" name="sexo" value="masculino" checked="1"> Masculino<br>'
           + '      <input type="radio" name="sexo" value="femenino"> Femenino'
           + '    </form>'
           + '    <p>Esto no debe aparecer</p>'
           + '    <form>'
           + '      Segundo form <input type="button" value="Funciona">'
           + '    </form>'
           + '  </body>'
           + '</html>';

  // Se crea el documento
  var doc = Xml.parse(html, true);        //Xml.parse está obsoleto pero sigue funcionando y mejor que XmlService
  var body = doc.html.body.toXmlString(); //truco para que funcione XmlService (sino no acepta HTML que no cumple como XML)
  var atom = XmlService.getNoNamespace();
  doc = XmlService.parse(body);
  var root = doc.getRootElement();
  var i, resultado = '';

  // Se obtienen todos los forms
  var forms = getElementsByTagName(root, 'form');

  // Se unen en un string
  for(i in forms) resultado += XmlService.getRawFormat().format(forms[i]);

  // Envíar resultado como salida del script
  return HtmlService.createHtmlOutput(resultado);
}

function getElementsByTagName(element, tagName) {  
  // Fuente: https://sites.google.com/site/scriptsexamples/learn-by-example/parsing-html
  var data = [];
  var descendants = element.getDescendants();
  for(i in descendants) {
    var elt = descendants[i].asElement();     
    if( elt !=null && elt.getName()== tagName) data.push(elt);      
  }
  return data;
}

Ключ этого - что однажды конвертируемый, мы имеем по отношению к XML преимущество в том, чтобы обладать функциями, чтобы двигаться по специфическим частям каждого элемента. Мы используем метод getDescendants() чтобы получать все узлы, и getName() чтобы видеть, form ли это.

Результат:

<body><form> <input type="radio" name="sexo" value="masculino" checked="1"> Masculino<br> <input type="radio" name="sexo" value="femenino"> Femenino </form><form> Segundo form <input type="button" value="Funciona"> </form></body>


Метод 2: Regex (он может не удаваться)

Следующий regex встречается с текстом одного <form> от начала до конца.

/<\s*form\b[\s\S]*?<\s*\/\s*form\b[^>]*>/gi

demo в regex101.com

Описание

  • <\s*form Совпади с < + 0 или более типов места + form
  • \b совпади, если он находится в положении, которое является пределом полного слова (так он совпадает с form и не с formosa).
  • [\s\S]*? совпади с любым повторенным характером 0 или более раз. Кроме того, последний ? он способствует тому, чтобы повторение вело себя без жадности, то есть повторялось самое меньшее количество возможных раз (этот синтаксис решает проблему /.*?/s).
  • <\s*\/\s*form\b он - главный файл для </form, у которого может быть место около бруска и это должно быть полное слово.
  • [^>]* потрати все символы, любой характер, кроме >.
  • > совпади с концом tag.
  • /gi Установи способы: глобальный, для того, чтобы он возвратил все результаты, которые он находит; и не отличаясь между прописными буквами и строчными буквами.

Код

function doGet() {
  // En vez de obtener el html con UrlFetchApp.fetch(), se usa esto a modo de ejemplo
  var html = '<html>'
           + '  <body>'
           + '    <p>Texto a borrar</p>'
           + '    <form>'
           + '      <input type="radio" name="sexo" value="masculino" checked="1"> Masculino<br>'
           + '      <input type="radio" name="sexo" value="femenino"> Femenino'
           + '    </form>'
           + '    <p>Esto no debe aparecer</p>'
           + '    <form>'
           + '      Segundo form <input type="button" value="Funciona">'
           + '    </form>'
           + '  </body>'
           + '</html>';

  var regex = /<\s*form\b[\s\S]*?<\s*\/\s*form\b[^>]*>/gi;

  // Se extraen todos los forms del html y se unen en un string
  var forms = html.match(regex);
  var resultado = forms.join('');
  return HtmlService.createHtmlOutput(resultado);
}

Когда он мог бы не удаваться?

Есть большая информация в Вебе, относительно почему не годится использовать regex, чтобы обрабатывать HTML. В очень большие черты, в любой структуре, которая ослепляла бы этикетки <form> или что позволил использовать их без того, чтобы они были оценены как таковой. Без in очень далеко, регулярное выражение не удалось бы, когда есть form внутри комментария:

<form>
  Formulario con comentarios
  <!-- Comentario con "</form>" dentro --!>
</form>

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

6
ответ дан 24.11.2019, 14:33

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

С JQuery ты можешь делать это простой формой:

$('form').each(function(){
   var html = $( this ).html();
})

Так ты выбираешь все Form страницы, пробегаешь их и из-за каждого ты подбираешь Ваш внутренний html, если ты нуждаешься в том, чтобы выбрать одно специфическое средство, можешь изменять селектор. Это форма, ты можешь использовать другие frameworks, но регулярные выражения не являются рекомендуемыми.

ЗАМЕТЬ: Что не был регулярным языком, не означает, что не функционировали некие регулярные выражения, но он не выполняет условия для того, чтобы все они функционировали.

0
ответ дан 24.11.2019, 14:33
  • 1
    Достаточно лучше:) и #191; podr и # 237; схвати упоминать о примере, и где возможно консультировать полные условия? – Rubén 05.08.2016, 15:20
  • 2
    Я могу показывать тебе сайт, куда бросать глаз [ stackoverflow.com/questions/590747/… (est и # 225; в ingl и # 233; s, в кастильце есть мало дискуссий относительно этого). Ты можешь находить полные условия легко в Вебе, но у них есть Ваш complicaci и # 243; n, необходимо применяться l и # 243; gica matem и # 225; костариканская. Porcierto я не буду мочь отвечать во времени, но конечно, что много людей могут помогать тебе, это хорошее сообщество . – Mikel 05.08.2016, 15:29
  • 3
    @Mikel Вопрос - используя Google Аппс Скрипт . html загружен как текст UrlFetchApp.fetch(). С $('form') снабжают ссылками form ее p и # 225; gina настоящий, не ее p и # 225; gina полученная, так как сначала нужно приносить к DOM ее, а следовательно не функционировать и # 237; в. – Mariano 05.08.2016, 17:37
  • 4
    @Mikel: Спасибо за ссылку. Я result и # 243; и #250; til, чтобы знать м и # 225; s регулярных выражений. Я не использовал jQuery в Google Аппс Скрипт, но понимаю, что, если возможно использовать стороны клиента используя HTMLService, но я не уверен, возможно ли делать это стороной сервера, но этим уже быть и # 237; в другой вопрос, я верю. – Rubén 05.08.2016, 17:50
  • 5
    Если, в этом у него есть raz и # 243; n, за довольно объясненную форму, @Mariano, извини ошибку. – Mikel 08.08.2016, 09:19

Согласно ответ #1 в Issue 2098: Регулярный Multiline expression modifier not working есть проблемы, которые препятствуют использованию модификатора m однако, возможно использовать в Вашем месте что-то как [\s\S].

Следующий cГіdigo, если ему удается получить правильно cГіdigo между этикетками form:

function doGet() {
  var html = UrlFetchApp.fetch('https://docs.google.com/forms/d/1awKpg_diniayS6360kNXrcgihk36azQ3DJEaZqXDY7A/viewform?embedded=true').getContentText();
  var output = html.match(/<form[\s\S]*form>/g);
  return HtmlService.createHtmlOutput(output);
}
-1
ответ дан 24.11.2019, 14:33

Теги

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