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

14

我需要检测形如@base64 (例如@VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==)的字符串是否存在于我的应用程序中。

@必须出现在字符串开头,base64编码字符串的字符集包括a-z, A-Z, 0-9, +, /=。是否使用适当的正则表达式来检测它们?

谢谢


1
可能是用于解析或验证Base64数据的正则表达式的重复问题。 - Regexident
3个回答

14

以下代码可能会适用(但不检查长度是否正确!):

^@[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个。可以检查这个吗? - federico-t
那么^@(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$是正确的吗? - federico-t
2
是的和不是的,如果你对以@符号开头的任何内容的来源有信心,那么是的,那应该足够好了。虽然我假设你正在尝试检测它,因为它可能不是一个有效的来源,在这种情况下,即使像@HeyThisIsMyTweeterHandle这样的东西也可能被检测为base64。这些都是你应该考虑的事情。如果你控制通信的两端,我会重新构造一下。这也可能有助于简单地进行-如果第一个字符是@,那么如果base64_decode($str, true) !== false,那么就进行base64_decode。不需要正则表达式。 - JRomero
那将是一个不错的解决方案,问题在于我正在尝试从上下文中提取base64(例如用户提交的文本中间)。是的,@HeyThisIsMyTweeterHandle 也会被验证,但这对我来说不是问题,只要它是有效的(长度也正确)base64。 - federico-t
+1 对 J.Romero 的建议,只需使用本地的 PHP base64 函数。 - Regexident
显示剩余4条评论

4

@PierrOz 可能是从 https://dev59.com/unRB5IYBdhLWcg3w6LN2 中提取的,但我仍然很难看出其中的内容。 - federico-t
2
@Federico-Quagliotto,你觉得直接链接到Gumbo的答案怎么样?而不是毫不顾忌地抄袭而不给予应有的荣誉? - Regexident
2
我可以看到正则表达式基本相同,很抱歉之前没有在stackoverflow上检查过。我只是在许多事情中使用base64,这就是全部。 - Federico Quagliotto
@PierrOz:请看我的答案,其中有正则表达式的解释。 - Regexident
@FedericoQuagliotto:对于那个指控我很抱歉。它是第一个出现的结果,看起来像是明目张胆的盗窃行为。 - Regexident

1

这里是另一种正则表达式:

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

它满足如下条件:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接