【问题标题】:RegEx for detecting base64 encoded strings用于检测 base64 编码字符串的正则表达式
【发布时间】:2011-12-27 17:00:02
【问题描述】:

我需要在我的应用程序中检测格式为 @base64 的字符串(例如@VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==)。

@ 必须在开头,base64 编码字符串的字符集是 a-zA-Z0-9+/=。是检测它们的适当正则表达式吗?

谢谢

【问题讨论】:

标签: php regex base64


【解决方案1】:

应该这样做(不检查正确的长度!):

^@[a-zA-Z0-9+/]+={,2}$

任何 base64 编码字符串的长度必须是 4 的倍数,因此是附加的。

请参阅此处了解检查正确长度的解决方案:RegEx to parse or validate Base64 data

来自链接答案的正则表达式的快速解释:

^@ #match "@" at beginning of string
(?:[A-Za-z0-9+/]{4})* #match any number of 4-letter blocks of the base64 char set
(?:
    [A-Za-z0-9+/]{2}== #match 2-letter block of the base64 char set followed by "==", together forming a 4-letter block
| # or
    [A-Za-z0-9+/]{3}= #match 3-letter block of the base64 char set followed by "=", together forming a 4-letter block
)?
$ #match end of string

【讨论】:

  • 我忘了提到的是,base64 编码的字符串只有在末尾有“=”字符,最多有 2 个。可以检查吗?
  • ^@(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[ A-Za-z0-9+/]{3}=)?$ 会是正确的吗?
  • 是的,不是的,如果你对以@符号开头的任何东西的来源有信心,那么是的,这应该足够好了。尽管我假设您正在尝试检测它,因为它可能不是有效的来源,在这种情况下,即使像 @HeyThisIsMyTweeterHandle 这样的东西也可能被检测为 base64。这些是你应该考虑的事情。如果您可以控制通信的两端,我会对其进行一些重组。简单地做一个 - if first char @ then if base64_decode($str, true) !== false then base64_decode 也可能会有所帮助。无需注册。
  • 好吧,如果你基本上只是想检查字符集的正确性和一些基本的前缀/后缀检查,那么我的简短就足够了。然而,较长的也检查适当的长度。
  • 那将是一个很好的解决方案,问题是我试图从上下文中提取 base64(例如,在用户提交的文本中间)。是的,@HeyThisIsMyTweeterHandle 也会验证,但这对我来说不是问题,只要它是有效的(也有适当的长度)base64
【解决方案2】:

尝试:

^@(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$

=> RegEx to parse or validate Base64 data

【讨论】:

  • @PierrOz 可能是从 stackoverflow.com/questions/475074/… 中提取的,但我仍然很难,所以看看那里发生了什么
  • @Federico-Quagliotto 如何链接到 Gumbo 的答案而不是公然窃取它而不给予应得的信用?
  • 不偷,只是检查了我有用的正则表达式存档。我在很多事情上都使用 base64,仅此而已。我可以看到它的正则表达式非常相似,抱歉之前没有检查过stackoverflow。
  • @PierrOz:请参阅我的答案以了解正则表达式的解释。
  • @FedericoQuagliotto:那么对指控感到抱歉。是第一个出现的结果,看起来像是公然的偷窃。
【解决方案3】:

这是一个替代的正则表达式:

^@(?=(.{4})*$)[A-Za-z0-9+/]*={0,2}$

满足以下条件:

  • @ 符号后的字符串长度必须是四的倍数 - (?=^(.{4})*$)
  • 内容必须是字母数字字符或+或/-[A-Za-z0-9+/]*
  • 结尾最多可以有两个填充 (=) 字符 - ={0,2}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多