【问题标题】:How do I prepend a string to every link in a HTML page?如何在 HTML 页面中的每个链接前面添加一个字符串?
【发布时间】:2015-01-02 11:03:20
【问题描述】:

我有一个 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);
}

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

更新:在继续尝试自己解决问题时,我注意到一些页面在其链接中使用相对 URL。答案需要考虑这一点并将相对 URL 修改为绝对 URL,然后再添加脚本 URL。

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

【问题讨论】:

    标签: javascript html google-apps-script


    【解决方案1】:

    您应该使用正则表达式自动替换所有 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 的完整 URL,而不是相对的 URL,但您也可以做一些小的改动。
    这里有一些你可能想看看的链接:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 2011-01-08
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      相关资源
      最近更新 更多