Php 从长文本中剥离Base64字符串

Php 从长文本中剥离Base64字符串,php,regex,Php,Regex,我真的很想知道我是否真的是第一个问这个问题的人,还是我对这个问题一无所知 我有一个较长的文本,我想去掉它的base64编码字符串 我是一个文本,有一些内容行 有不止一行,但有时我有 aSBhbSBhIG5vcm1hbCB0ZXh0IHRoYXQgd2FzIGNvZ GVkIGluIGJhc2UgNjQgYW5kIG5vdyBpIHdhcyB0cmFu C2XHDGVKIGJHY2SGDG8GymXHBMSGDV4DGZVCM1HD C4GASB0AGFUAYB5B3UGZM9YIHHEWLUZY

我真的很想知道我是否真的是第一个问这个问题的人,还是我对这个问题一无所知

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

我是一个文本,有一些内容行

有不止一行,但有时我有

aSBhbSBhIG5vcm1hbCB0ZXh0IHRoYXQgd2FzIGNvZ

GVkIGluIGJhc2UgNjQgYW5kIG5vdyBpIHdhcyB0cmFu

C2XHDGVKIGJHY2SGDG8GymXHBMSGDV4DGZVCM1HD

C4GASB0AGFUAYB5B3UGZM9YIHHEWLUZYBHDLBNRP

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:猜猜这种情况下最好的语法是什么?跟踪具有多个大写字符且可以有数字且没有空格的字符串。但是regex不是我的日常面包:D

对于示例中的代码片段
/^\w{53}$/gm
起作用。如果你能依靠课程的长度

编辑:


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

首先:您不能可靠地做到这一点

为什么?

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

背景

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

因此,您只能决定一个长度,然后考虑字符没有任何空间连接到BASE64编码。当然,在德语等语言中,你可能会遇到一些麻烦,因为这里有一个复合名词,比如“Bäckerfachverkäuferinnenhosenherstellungsautomatenzulieferedinst”之类的(只是编造出来的)

解决方法

因此,关于长度,你必须自己决定,然后你可以这样做:

[a-zA-Z0-9\+\/\=]{20,}
另请参见此处的示例:

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


编辑:Gnah。。您甚至可以在我的示例中看到,我没有抓住最后一行:)当将数字更改为12时,在这里效果很好,但可能有超过12个字符的单词。。。如前所述,以这种方式不太可能实现。

您有通过文本出现的base64字符串吗?对不起,我不明白?!?!?!关键是,客户会复制邮件的全部内容,因为他不太熟悉区分字符串。所以我叫他把全部内容都抄下来。有问题的非base64字符串会使输出混乱。所以我必须先把它们处理掉:)事实上我不知道长度。它可以更长或更短。。这是一封电子邮件内容好吧,这完全是另一个问题那么=)在电子邮件中,您的base64编码字符串不会随机分布在文本中。在电子邮件中,你有边界和
内容传输编码:base64
实际上我同意这一点。但是,我公司的一位客户使用工具将一些电子邮件从一个程序转移到另一个程序。我对那个工具一无所知。既然他这么做了,所有的邮件都有简单的base64内容,他已经删除了所有的原始邮件。。。大约1k封邮件。他仍然需要数据。所以我给他设置了一个页面,在那里他可以用c&p对内容中的每一个垃圾进行c&p,然后取出编码的东西。所以这个问题实际上是对的。但是,是的,您也是对的:)“Hello”不能是Base64字符串,因为它没有填充
=
。即使是“Hello=”不能给出有效的UTF8结果:)@RokoC.Buljan,你说得对!然而,PHP很奇怪,您实际上可以对其进行解码:但不能使用填充。奇怪吧?很好的解释。我明白了。。。所以没有办法告诉正则表达式新行可能仍然是同一个词?一般来说不是,但你可能会在检查几封电子邮件时发现一个模式。适用于给定的示例。我仍在处理它,因为实际上基本代码很长或包含数字。所以我在测试类正则表达式(有大小写字母,也可以有数字),我想创建一个类正则表达式(字符串至少有2个大写字符),因为没有语言有camelwritestyle:D