【问题标题】:Golang Regex to replace domain to proxy URLGolang Regex 将域替换为代理 URL
【发布时间】:2021-10-01 12:31:09
【问题描述】:

我想将网页的所有链接替换为反向代理域。

规则是

https://test.com/xxx --> https_test_com.proxy.com/xxx
http://sub.test.com/xxx --> http_sub_test_com.proxy.com/xxx

如何在golang中通过正则表达式实现?

响应体类型为[]byte,字符编码为UTF-8。
我已经尝试过这种方式。但它不能将源域中的所有 dot 替换为 underscore。子域的长度是可变的,这意味着 dot 的数量可以变化

respBytes := []byte(`_.Xc=function(a){var b=window.google&&window.google.logUrl?"":"https://www.google.com";b+="/gen_204?";b+=a.j(2040-b.length);
        <cite class="iUh30 Zu0yb tjvcx">https://cloud.google.com</cite></div><div class="eFM0qc"><a class="fl" href="https://webcache.googleusercontent.com/search?q=cache:80SWJ_cSDhwJ:https://cloud.google.com/+&amp;cd=1&amp;hl=en&amp;ct=clnk&amp;gl=au" ping="/url?sa=t&amp;source=web&amp;rct=j&amp;url=https://webcache.googleusercontent.com/search%3Fq%3Dcache:80SWJ_cSDhwJ:https://cloud.google.com/%2B%26cd%3D1%26hl%3Den%26ct%3Dclnk%26gl%3Dau&amp;ved=2ahUKEwia5ovYsv3xAhXS4jgGHad0BJYQIDAAegQIBRAG"><span>Cached</span></a></li><li class="action-menu-item OhScic zsYMMe" role="menuitem"><a class="fl" href="/search?q=related:https://cloud.google.com/+google+cloud&amp;sa=X&amp;ved=2ahUKEwia5ovYsv3xAhXS4jgGHad0BJYQHzAAegQIBRAH">
        `)
proxyURI := "proxy.com"
var re = regexp.MustCompile(`(http[s]*):\/\/([a-zA-Z0-9_\-.:]*)`)
content := re.ReplaceAll(respBytes, []byte("${1}_${2}."+proxyURI))


origin result expect
https://www.google.com https_www.google.com.test.com https_www_google_com.test.com
https://cloud.google.com https_cloud.google.com.test.com https_cloud_google_com.test.com
https://https://webcache.googleusercontent.com https_cloud.google.com.test.com https_webcache_googleusercontent_com.test.com

【问题讨论】:

标签: html regex go


【解决方案1】:

您可以这样做:

func replaceAndPrint() {
    src := `
<a href="https://test.com/xxx">link 1</a>
<a href="https://test.com/yyy">link 2</a>
`
    r := regexp.MustCompile("\"https://(test\\.com.*)\"")
    result := r.ReplaceAllString(src, "http://sub.$1")
    fmt.Println(result)
}

输出:

<a href=http://sub.test.com/xxx>link 1</a>
<a href=http://sub.test.com/yyy>link 2</a>

说明: regexp.MustCompile 的参数定义了一个捕获组(在一对括号内)。该捕获组的值由$1 在对r.ReplaceAllString 的调用中引用。

更新:

对不起,看错了例子。

这是一个更新的版本:

func replaceAndPrint2() {
    src := `
<a href="http://test.com/xxx">link 1</a>
<a href="https://sub1.sub2.test.com/yyy">link 2</a>
`
    r := regexp.MustCompile("(\\.|://)([^./]*)")
    replacer := strings.NewReplacer("://", "_", ".", "_")
    res := r.ReplaceAllStringFunc(src, func(g string) string {
        if g == ".com" {
            return replacer.Replace(g) + ".proxy.com"
        }
        return replacer.Replace(g)
    })
    fmt.Println(res)
}

输出:

<a href="http_test_com.proxy.com/xxx">link 1</a>
<a href="https_sub1_sub2_test_com.proxy.com/yyy">link 2</a>

【讨论】:

  • 对不起,规则是不将域替换为其子域。 ?
  • 谢谢,ReplaceAllFuncReplaceAllStringFunc 可以很好地匹配目标,用函数格式化和替换。
猜你喜欢
  • 2017-03-20
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 2012-04-08
  • 2014-05-30
  • 1970-01-01
相关资源
最近更新 更多