用于检测 base64 编码字符串的正则表达式
Posted
技术标签:
【中文标题】用于检测 base64 编码字符串的正则表达式【英文标题】:RegEx for detecting base64 encoded strings 【发布时间】:2011-12-27 17:00:02 【问题描述】:我需要在我的应用程序中检测格式为 @base64 的字符串(例如@VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==
)。
@ 必须在开头,base64 编码字符串的字符集是 a-z
、A-Z
、0-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还是图片链接