Я пытаюсь получить href из HTML-документа (электронная почта Gmail), в котором есть текст ссылки «кошки».
Например, Я хочу извлечь URL-адреса из приведенных ниже ссылок, которые будут где угодно в html-документе.
<a href = "https://www.google.com/search?q=cats&oq=cats" target = "_blank">cats</a>
or
<a href = "https://www.google.com/search?q=cats&oq=cats" target = "_blank">yay cats</a>
Примечание. Я создаю надстройку для Gmail.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это тестер регулярных выражений, поэтому он, вероятно, больше, чем вы ожидали, но он найдет ссылки, которые вы ищете, а также любые другие, которые вы хотите найти. Это будет работать для ваших текущих потребностей: <.*q=cats.*>. В настоящее время используется функция регулярных выражений String.match, вы можете найти ее объяснение здесь Внизу страницы есть URL-адрес, который должен указывать на электронную таблицу, содержащую страницу с именем «По умолчанию», как объяснено позже.
function buildAddOn(e) {
var accessToken = e.messageMetadata.accessToken;
GmailApp.setCurrentMessageAccessToken(accessToken);
var msg=GmailApp.getMessageById(e.messageMetadata.messageId).getPlainBody();
setDefaults({message:msg});
var cards = [];
cards.push(buildRegexTester(getDefaults()));
return cards;
}
function buildRegexTester(dfltObj){
var card=CardService.newCardBuilder();
card.setHeader(CardService.newCardHeader().setTitle('Regex Tester'));
var section=CardService.newCardSection().setHeader('Email Body Search');
var plainBodyText=CardService.newTextParagraph().setText(dfltObj.message);
section.addWidget(plainBodyText)
var saveRegexButton=CardService.newTextButton().setText('Save Regex').setOnClickAction(CardService.newAction().setFunctionName('saveRegex'));
section.addWidget(saveRegexButton);
var regexTextBox=CardService.newTextInput()
.setFieldName('Regex')
.setTitle('Regex')
.setMultiline(true)
.setValue(dfltObj.Regex);
section.addWidget(regexTextBox);
var searchButton=CardService.newTextButton().setText('Search').setOnClickAction(CardService.newAction().setFunctionName('search'));
section.addWidget(searchButton);
var regexResultBox=CardService.newTextInput()
.setFieldName('Results')
.setTitle('Results')
.setMultiline(true)
.setValue(dfltObj.results);
section.addWidget(regexResultBox);
var clearResultsButton=CardService.newTextButton().setText('Clear Results').setOnClickAction(CardService.newAction().setFunctionName('clearResults'));
section.addWidget(clearResultsButton)
var g_toggle=CardService.newKeyValue()
.setContent('global search')
.setSwitch(CardService.newSwitch()
.setSelected(dfltObj.g)
.setFieldName('g')
.setValue('g')
.setOnChangeAction(CardService.newAction().setFunctionName('saveFlags')));
section.addWidget(g_toggle);
var i_toggle=CardService.newKeyValue()
.setContent('ignore case')
.setSwitch(CardService.newSwitch()
.setSelected(dfltObj.i)
.setFieldName('i')
.setValue('i')
.setOnChangeAction(CardService.newAction().setFunctionName('saveFlags')));
section.addWidget(i_toggle);
var m_toggle=CardService.newKeyValue()
.setContent('multiline search')
.setSwitch(CardService.newSwitch()
.setSelected(dfltObj.m)
.setFieldName('m')
.setValue('m')
.setOnChangeAction(CardService.newAction().setFunctionName('saveFlags')));
section.addWidget(m_toggle);
card.addSection(section);
return card.build();
}
function getDefaults(){
var ss=SpreadsheetApp.openByUrl(RegexTesterAddon_URL);
var sh=ss.getSheetByName('Defaults');
var rg=sh.getDataRange();
var vA=rg.getValues();
var dfltObj = {};
for(var i=0;i<vA.length;i++){
dfltObj[vA[i][0]]=vA[i][1];
}
return dfltObj;
}
function setDefaults(dfltObj){
var ss=SpreadsheetApp.openByUrl(RegexTesterAddon_URL);
var sh=ss.getSheetByName('Defaults');
var rg=sh.getDataRange();
var vA=rg.getValues();
for(var i=0;i<vA.length;i++){
if (typeof(dfltObj[vA[i][0]])!='undefined'){
vA[i][1]=dfltObj[vA[i][0]];
}
}
rg.setValues(vA);
}
function saveFlags(e){
Logger.log('\nsaveFlags():\n%s\n',e);
var g=(typeof(e.formInput.g)!='undefined')?true:false;
var i=(typeof(e.formInput.i)!='undefined')?true:false;
var m=(typeof(e.formInput.m)!='undefined')?true:false;
var flagObj = {g:g,i:i,m:m};
setDefaults(flagObj);
}
function saveRegex(e){
Logger.log('\nsaveRegex():\n%s',e);
var regex=(typeof(e.formInput.Regex)!='undefined')?e.formInput.Regex:'';
if (regex){
var rObj = {Regex:regex};
setDefaults(rObj);
}
}
function saveResults(rsltObj){
setDefaults(rsltObj);
}
function getFlags(){
var dfltObj=getDefaults();
var flagsA=[];
if (dfltObj.g){flagsA.push('g');}
if (dfltObj.i){flagsA.push('i');}
if (dfltObj.m){flagsA.push('m');}
var flags=flagsA.join('');
return flags;
}
function search(e){
Logger.log('\nSearch():\n%s',e);
if (typeof(e.formInput.Regex)!='undefined'){
saveFlags(e);
saveRegex(e);
var dfltObj=getDefaults();
var flags=getFlags();
var pattern=dfltObj.Regex;
Logger.log('\nflags: %s\npattern: %s',flags,pattern);
var re=new RegExp(pattern,flags);
//var result=re.exec(dfltObj.message);
var result=dfltObj.message.match(re);
if (result) {
Logger.log('\nresult: %s\nmessage:',result,dfltObj.message);
if (result){
var rsltLog='';
for(var i=0;i<result.length;i++){
if (i>0){rsltLog+='\n'};
rsltLog+='result[' + i + ']= ' + result[i];
}
}
console.info('module: %s pattern: %s regex: %s flags: %s result: %s length: %s',"findData()",pattern,re,flags,rsltLog,result.length);
}
if (result){
var results=rsltLog;
}else{
var results = "No Results";
}
//var rsltObj = {results:results};
var rsltObj = {results:escapeHtml(results)};
saveResults(rsltObj);
return buildRegexTester(getDefaults());
}
}
function clearResults(e){
var dfltObj=getDefaults();
dfltObj.results='';
return buildRegexTester(dfltObj);
}
//Came From: @Kip https://stackoverflow.com/a/4835406/7215091
function escapeHtml(text) {
var map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return text.replace(/[&<>"']/g, function(m) { return map[m]; });
}
var RegexTesterAddon_URL='link to a spreadsheet that contain defaults';
В электронной таблице должна быть страница с именем «По умолчанию», и она выглядит следующим образом:
На странице используются только столбцы A и B, и она должна иметь сообщение, регулярное выражение, g, i, m и результаты, как показано на рисунке. Типичная настройка для g,i,m — TRUE, FALSE, FALSE, которая поможет вам начать работу. Это регулярное выражение работает для ваших текущих требований <.*q=cats.*>
Я не буду контролировать HTML. Это надстройка Gmail, поэтому она будет работать на любой электронной почте.
Извините, я только пометил этим вопрос... Я обновлю текст вопроса этим.
Надеюсь, это решение поможет найти нужную ссылку, а также многие другие.
Ох... мне многое предстоит переварить. Пожалуйста, дайте мне немного времени, чтобы рассмотреть и попробовать. Кстати, не могли бы вы отменить голосование против?
:) Справедливо. Надеюсь, я смогу заработать его обратно!
Итак, я попытался понять ваш код... не думаю, что я полностью понял, но понял суть, а затем меня осенило, что я недооцениваю регулярные выражения. Затем я попытался создать простое регулярное выражение (regexr.com/49eeh) и выполнить его в своем дополнении, но оно возвращает null, когда не должно. Код в скрипте приложения-> "var regex = /(href=(.*))+(>helloworld</a>)/gi;"
Я думал, ты ищешь кошек. Регулярные выражения легко недооценить.
Большая часть карты представляет собой базовый материал CardService для надстроек Gmail. Я предположил, что вы это уже знали. А остальные сценарии приложений в основном просто сохраняют и извлекают значения по умолчанию из электронной таблицы.
@Cooper извините за поздний ответ. Вчера отсутствовал у моего компьютера, но я просмотрел множество других вариантов (здесь перечислены два: stackoverflow.com/questions/18727341/… | Bettercloud.com/monitor/the-academy/…). Все они предоставляют способы извлечения href, но не способы получения информации о конкретной ссылке.