Я хочу получить код между этикетками 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 Аппс Скрипт не принимает их.
Возможно использовать эти модификаторы? Как?
regex, который ты используешь, не встречается с form, потому что в .*?
, точка совпадает с любым характером меньше разрывов линии. Относительно твоего вопроса, модификаторы /g
и /m
они не имеют ничего общего с этим поведением. /g
он способствует тому, чтобы они возвратили себе все совпадения, и /m
измени поведение ^
и $
исключительно.
Я показываю 2 метода, чтобы получать все forms HTML: форма, которую я считаю правильной, и потом, как было бы возможно делать с regex (не такой заслуживающий доверия, но значительно более работоспособный и менее опасный, который использовать [\s\S]*
для contendido этикетки).
С 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>
Следующий regex встречается с текстом одного <form>
от начала до конца.
/<\s*form\b[\s\S]*?<\s*\/\s*form\b[^>]*>/gi
Описание
<\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>
И это может подлатывать легко, но после у нас будет другой редкий случай, который заставил бы это не удаваться и было бы возможно упорядочивать, и после другой, и другой, и я схватил последовательно.
HTML не выполняет условия, чтобы быть регулярным языком, не является рекомендуемым использовать регулярные выражения, чтобы относиться к этому языку.
С JQuery ты можешь делать это простой формой:
$('form').each(function(){
var html = $( this ).html();
})
Так ты выбираешь все Form страницы, пробегаешь их и из-за каждого ты подбираешь Ваш внутренний html, если ты нуждаешься в том, чтобы выбрать одно специфическое средство, можешь изменять селектор. Это форма, ты можешь использовать другие frameworks, но регулярные выражения не являются рекомендуемыми.
ЗАМЕТЬ: Что не был регулярным языком, не означает, что не функционировали некие регулярные выражения, но он не выполняет условия для того, чтобы все они функционировали.
html
загружен как текст UrlFetchApp.fetch()
. С $('form')
снабжают ссылками form ее p и # 225; gina настоящий, не ее p и # 225; gina полученная, так как сначала нужно приносить к DOM ее, а следовательно не функционировать и # 237; в.
– Mariano
05.08.2016, 17:37
Согласно ответ #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);
}