【问题标题】:Regular expression to validate image正则表达式验证图像
【发布时间】:2016-06-11 19:12:00
【问题描述】:

我正在用 golang 编写一个 Web 应用程序。我正在使用正则表达式来验证 URL。但我无法在 URL 验证中验证图像 (abc.png)。

var validPath = regexp.MustCompile("^/$|/(home|about|badge)/(|[a-zA-Z0-9]+)$")

以上 URL 采用 /home//about/,但无法转换为 /abc.png。我的意思是 . 本身不工作

我尝试了以下正则表达式,但没有帮助

var validPath = regexp.MustCompile("^/$|/(home|about|badge|.)/(|[a-zA-Z0-9]+)$")
var validPath = regexp.MustCompile("^/$|/(home|about|badge)(/|.)(|[a-zA-Z0-9]+)$")

我正在尝试匹配http://localhost:8080/badge.png

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你不允许在任何地方点。您可以将点放在字符类中。我也不确定最后一个管道相对于括号的位置。
  • 您的问题不清楚。请写一些正则表达式必须匹配的示例。顺便说一句,你为什么使用 2 "$"?字符串的结尾只能出现一次。
  • @LarsFischer - 我用我的尝试更新了这个问题。但这没有帮助
  • 我以为你想匹配这样的东西。看看rubular.com/r/Hi5xVkbDOD。对吗?
  • this demo。看起来^/$|^(?:/(home|about|badge))?/((?:badge|abc)\.png|[a-zA-Z0-9]*)$ 应该适合你。请告诉我。

标签: regex image validation go


【解决方案1】:

看来

^/$|^(?:/(home|about|badge))?/((?:badge|abc)\.png|[a-zA-Z0-9]*)$

应该适合你。请参阅regex demo

模式分解:

  • ^/$ - 一个 / 作为一个完整的字符串
  • | - 或者...
  • ^ - 字符串开头
  • (?:/(home|about|badge))? - / 的可选序列 + homeaboutbadge
  • / - / 符号后跟
  • ((?:badge|abc)\.png|[a-zA-Z0-9]*) - 第 1 组捕获:
    • (?:badge|abc)\.png - badgeabc 后跟 .png
    • | - 或者...
    • [a-zA-Z0-9]* - 零个或多个字母数字
  • $ - 字符串结束

这里是Go playground demo

package main

import "fmt"
import "regexp"

func main() {
    //var validPath = regexp.MustCompile("^/((home|about)(/[a-zA-Z0-9]*)?|[a-zA-Z0-9]+\\.[a-z]+)?$")
    var validPath = regexp.MustCompile(`^/$|^(?:/(home|about|badge))?/((?:badge|abc)\.png|[a-zA-Z0-9]*)$`)

    fmt.Println(validPath.MatchString("/"), validPath.MatchString("/home/"), validPath.MatchString("/about/"), validPath.MatchString("/home/13jia0"), validPath.MatchString("/about/1jnmjan"), validPath.MatchString("/badge.png"), validPath.MatchString("/abc.png"))
    fmt.Println(validPath.MatchString("/nope/"), validPath.MatchString("/invalid.png"), validPath.MatchString("/test/test"))

    m := validPath.FindStringSubmatch("/about/global")
    fmt.Println("validate() :: URL validation path m[1] : ", m[1])
    fmt.Println("validate() :: URL validation path m[2] : ", m[2])
    if m == nil || m[2] != "global" {
        fmt.Println("Not valid")
    }
}

【讨论】:

    【解决方案2】:

    您正在寻找的是以下内容(基于您发布的示例路径):

    var validPath = regexp.MustCompile("^/((home|about)(/[a-zA-Z0-9]*)?|[a-zA-Z0-9]+\\.[a-z]+)?$")
    

    Playground with examples

    【讨论】:

    • 谢谢。非常符合我的要求。但我也在尝试将 abc.png 与 batch.png 匹配。我在你的 goplay 中尝试了以下内容。但它不起作用。你能建议我怎么做吗? var validPath = regexp.MustCompile("^/((home|about)(/?[a-zA-Z0-9]*)(|badge|abc)\\.png)?$")
    • 更新了我的答案以支持这一点。
    • (或者你的意思是专门支持badge.png和abc.png,而不是允许任何其他图片?)
    • 你说的特别对 abc.png |徽章.png。我也试图在大约之后得到字符串。例如 /about/global ` m := validPath.FindStringSubmatch(r.URL.Path) log.Printf("validate() :: URL 验证路径 m[2] : ", m[2]) if m == nil { http.NotFound(w, r) return }` 它没有占用 m[2] = global.
    • 见鬼,这看起来像很多不必要的工作。你没听说过httprouter吗?
    【解决方案3】:

    您可以使用以下正则表达式进行验证:

    var validPath = regexp.MustCompile("^\/(home|about|badge)\/[a-zA-Z0-9]+[.][a-z]+$")
    

    Ps:我做了一个灵活的正则表达式,所以它接受很多格式的图片:pngjpgjpeg等等..

    你可以在这里测试它:Regex

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2021-02-24
      • 2014-02-25
      • 2019-06-21
      相关资源
      最近更新 更多