从长文本中删除Base64字符串

时间:2016-01-21 15:21:15

标签: php regex

我真的很想知道我是否真的是第一个提出这个问题的人,或者我是如此盲目地找到了一些关于这个...

我有一个较长的文本,我想删除它的base64编码字符串

  

我是一个文字,并且有一些内容包含一些内容

     

有多行,但有时我有

     

aSBhbSBhIG5vcm1hbCB0ZXh0IHRoYXQgd2FzIGNvZ

     

GVkIGluIGJhc2UgNjQgYW5kIG5vdyBpIHdhcyB0cmFu

     

c2xhdGVkIGJhY2sgdG8gYmxhbmsgdGV4dGZvcm1hd

     

C4gaSB0aGFuayB5b3UgZm9yIHBheWluZyBhdHRlbnRp

     

b24uIGJ5ZQ ==

     

这就是我想用php

去除/提取的东西

正如您所看到的,文本中有base64编码数据,我想提取/去除这些行。

我已经尝试过很多类似

的正则表达式样本
$regex = '@^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$@m';
preg_match($regex, $content, $output_array );

但这没有解决任何问题......

我需要的是只选择基本字符串的正则表达式...

这甚至可能吗?我的意思是可以通过正则表达式选择base64吗? 我想:)

编辑:字符串 - 来源是电子邮件的内容

EDIT2:猜测这种情况的最佳语法是你的轨道字符串,它有多个带字符的字符,并且可以有数字且没有空格。但正则表达式不是我的日常面包:D

2 个答案:

答案 0 :(得分:2)

首先:你无法可靠地做到这一点!

<强>为什么吗

简单来说,base64在某些情况下如此之大的原因在于,它使用“标准”字符对所有数据进行编码。那些用于普通文本,句子,是的,甚至是单词。

<强>背景

“Hello”是base64编码的字符串吗?嗯,是的,它的意思是“有效的base64编码”。它可能会返回很多乱码,但它是一个base64-ok字符串。

因此,您只能决定一个长度,在该长度之后您考虑连接的字符,而没有任何空格进行base64编码。当然,在德语这样的语言中,你可能会遇到一些麻烦,就像有一个复合名词,比如“Bäckerfachverkäuferinnenhosenherstellungsautomatenzuliefererdienst”等等(就这样做了)。

解决方法

所以在你必须决定自己的长度上,然后你可以用这个:

[a-zA-Z0-9\+\/\=]{20,}

另见此处示例:https://regex101.com/r/uK5gM1/1

我认为“20”是这里“base64编码的东西”的最小长度,但如上所述,这取决于你。另外,作为一个小旁注,=不是真正的编码内容,而是填充字节,但我仍然将其添加到正则表达式。

编辑: Gna ..你甚至可以在我的例子中看到我没有抓到最后一行:)当将数字改为12时,它在这里工作正常,但可能有更多的单词超过12个字符...所以 - 如上所述,这种方式不太可靠。

答案 1 :(得分:1)

对于示例中的代码段/^\w{53}$/gm执行此任务。如果你可以依靠长度。

修改

考虑到环境和更新,我会选择/\n([\w=\n]{50,})\n/gs,但如果没有元数据,猜测解码内容的mime类型可能会很棘手,而且几乎不可能恢复文件名等。