用于检测 base64 编码字符串的正则表达式

Posted

技术标签:

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

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

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

谢谢

【问题讨论】:

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

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

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

满足以下条件:

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

【讨论】:

以上是关于用于检测 base64 编码字符串的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用“DEFINED”子表达式组合复杂的正则表达式

base64 正则表达式 ,判断图片是base64还是图片链接

C++ 正则检测字串,提取数字以及字符

用于匹配德国邮政编码的正则表达式,但不是

django - 用于匹配 url 安全 base64 字符串的 url 模式

用于验证邮政编码或城市的 JavaScript 正则表达式