如何将字符串添加到HTML页面中的每个链接?

时间:2014-11-06 03:01:25

标签: javascript html google-apps-script

我有一个Google Apps脚本来获取网页并将其输出。我需要重写页面中的任何链接以加载脚本。

即:

<a href="http://stackoverflow">Stackoverflow</a>

将被重写为

<a href="https://script.google.com/{snip}exec?http://stackoverflow.com">Stackoverflow</a>

其中https://script.google.com/{snip}exec?是脚本本身的URL。

这是我到目前为止所拥有的:

function getPage(url) {
  var options = {
    headers : {'Cache-Control' : 'max-age=0'}
  };
  var response = UrlFetchApp.fetch(url, options);

  var html = response.getContentText();

  // Prepend this string to each link in the page
  var script_url = ScriptApp.getService().getUrl() + "?";

  // MAGIC GOES HERE

  return HtmlService.createHtmlOutput(html);
}

如何将script_url字符串添加到HTML页面中的每个链接?

更新:在继续尝试自行解决这个问题时,我注意到有些网页在其链接中使用相对网址。在添加脚本URL之前,答案需要考虑这一点并修改绝对URL的相对URL。

(注意:我已使用Javascript标记了问题,但答案必须可在Google Apps脚本中使用。)

1 个答案:

答案 0 :(得分:1)

您应该使用regExp在所有html消息中自动替换您想要的内容。如果你构造一个健壮的,这应该工作,但要小心可能有一些例外,例如css url。

这是一个几乎可以运作的样本:

var script_url = ScriptApp.getService().getUrl() + "?url=";

function doGet(e) {
 var url = e.parameter.url;
  var options = {
    headers : {'Cache-Control' : 'max-age=0'}
  };
  var response = UrlFetchApp.fetch(url, options);

  var html = response.getContentText();

  // Prepend this string to each link in the page

  // MAGIC GOES HERE
  var pattern = /href=("|')((https?:\/\/|www\.)([\da-z\.-]+)\.([a-z\.]{2,6})([?=&\/\w\.-]*)*\/?)/igm;
  var out = html.replace(pattern,replacer);

  Logger.log(out);
  return HtmlService.createHtmlOutput(out);
}

function replacer(match, p1, p2, p3, offset, string){
//  Logger.log("replacing: "+p1+p2+" -- "+match);
  // p1 is nondigits, p2 digits, and p3 non-alphanumerics
  return("href="+p1+script_url+p2);
  return [p1, p2, p3].join(' - ');
}

我只处理带有http或www的完整网址,而不是相对的网址,但只要稍作修改,您也可以这样做 这里有一些您可能想要查看的链接:

8 reg exp you should now
Mozilla RegExp String.prototype.replace()
regex101