2014-11-06 37 views
0

我有一个Google Apps脚本来获取网页并将其输出。我需要重写页面中的任何链接以通过脚本加载。如何为HTML页面中的每个链接添加一个字符串?

即:

<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修改为绝对URL。

(注:我已标记的问题与Javascript但答案必须是在谷歌企业应用套件脚本可用)

回答

1

您应该使用正则表达式来代替你自动想做的事,所有的HTML邮件。如果你构建一个强大的应用程序,这应该工作,但要小心,可能有一些例外,例如一个CSS网址。

这里几乎工作样本:

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(' - '); 
} 

我只处理完整URL以http或www和不相关的,但有轻微的变化,你可以做到这一点。
这里是一些链接,您可能希望有一个看看:

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

相关问题