获取base64字符串的php正则表达式

获取base64字符串的php正则表达式,php,regex,Php,Regex,我有一个包含许多内容的文件smime.p7m。此内容中的一个或多个是这样的 --_3821f5f5-222-4a90-82e0-d8922ee62cc8_ Content-Type: application/pdf; name="001235_0001.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="001235_0001.pdf" JVB

我有一个包含许多内容的文件smime.p7m。此内容中的一个或多个是这样的

--_3821f5f5-222-4a90-82e0-d8922ee62cc8_
Content-Type: application/pdf;
name="001235_0001.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="001235_0001.pdf"

JVBERi0xLjMNCjMgMCBvYmoNCjw8DQogIC9UeXBlIC9YT2JqZWN0DQogIC9TdWJ0eXBlIC9J
bWFnZQ0KICAvRmlsdGVyIC9EQ1REZWNvZGUNCiAgL1dpZHRoIDI0MDkNCiAgL0hlaWdodCAz
AF6UAFACZoAUUAFABQA1TQAuaADGKAFoASgBaACgBKADpTAQnApAJ0oAdQAdKAD2oAXpQA3p
.........................................
0oAU9KAFHFABQAnSgBOaAFoAKACgAoAWgAoATGOlAAKAFoATpQAYoAO9AC0AFACZ7UAGKAFo
ZPi1JZBodj7GEjdqgELTq0RC7xeSu1yv+dwEltQFPoSMGcbiTf0cGyzbreEAAAAAAAA=
--------------ms021111111111111111111107--
如果文件名是pDF和下面的BASE64代码,是否有方法获取文件名(例如使用regex)?文件中可能有多个PDF文件

文件名不是问题所在。我是通过“filename=“(.*.pdf)”得到的。但是我不知道在文件名由字符A…Z A…Z数字0..9个符号
+
/
组成后如何得到base64代码。它最后还可以有一个或两个
=
,并且可以拆分成几行

if (preg_match('/filename=\"(?P<filename>[^"]*?\.pdf)\"\s*(?P<base64>([A-Za-z0-9+\/]+\s*)+=?=?)/', $s, $regres)) {
   print("FileName: {$regres['filename']}\n");
   print("Base64: {$regres['base64']}\n");
}
if(preg\u match('/filename=\”(?P[^“]*?\.pdf)\“\s*(?P([A-Za-z0-9+\/]+\s*)+=?=?)/”,$s,$regres)){
打印(“文件名:{$regres['FileName']}\n”);
打印(“Base64:{$regres['Base64']}\n”);
}
使用

PHP

preg_match_all('/^filename="([^"]*\.pdf)"\R+(.+(?:\R.+)+)/im', $str, $matches);
解释

--------------------------------------------------------------------------------
  (?im)                    set flags for this block (case-
                           insensitive) (with ^ and $ matching start
                           and end of line) (with . not matching \n)
                           (matching whitespace and # normally)
--------------------------------------------------------------------------------
  ^                        the beginning of a "line"
--------------------------------------------------------------------------------
  filename="               'filename="'
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    [^"]*                    any character except: '"' (0 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \.                       '.'
--------------------------------------------------------------------------------
    pdf                      'pdf'
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  "                        '"'
--------------------------------------------------------------------------------
  \R+                      any line break sequence (1 or more times (matching 
                           the most  amount possible))
--------------------------------------------------------------------------------
  (                        group and capture to \2:
--------------------------------------------------------------------------------
    .+                       any character except \n (1 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    (?:                      group, but do not capture (1 or more
                             times (matching the most amount
                             possible)):
--------------------------------------------------------------------------------
      \R                       any line break sequence
--------------------------------------------------------------------------------
      .+                       any character except \n (1 or more
                               times (matching the most amount
                               possible))
--------------------------------------------------------------------------------
    )+                       end of grouping
--------------------------------------------------------------------------------
  )                        end of \2

我认为这项任务根本不涉及验证,只关注数据提取——这使得不需要锐化正则表达式逻辑

您只需要在行首匹配
filename=“
,然后捕获引号包装的子字符串(只要它以
.pdf
结尾),然后在任意数量的空白字符之后,捕获所有字符,直到遇到一个或两个
=

使用贪婪的负字符类可以让正则表达式引擎快速移动。
m
模式修饰符告诉正则表达式引擎,
^
元字符(不是方括号内使用的
^
)除了字符串的开头外,还可以匹配行的开头

也许您想生成一个关联数组,其中键是文件名字符串,编码字符串是值,
array\u column()
在存在符合条件的匹配项时快速地进行设置

代码:()

输出:

array (
  '001235_0001' => 'JVBERi0xLjMNCjMgMCBvYmoNCjw8DQogIC9UeXBlIC9YT2JqZWN0DQogIC9TdWJ0eXBlIC9J
bWFnZQ0KICAvRmlsdGVyIC9EQ1REZWNvZGUNCiAgL1dpZHRoIDI0MDkNCiAgL0hlaWdodCAz
AF6UAFACZoAUUAFABQA1TQAuaADGKAFoASgBaACgBKADpTAQnApAJ0oAdQAdKAD2oAXpQA3p
.........................................
0oAU9KAFHFABQAnSgBOaAFoAKACgAoAWgAoATGOlAAKAFoATpQAYoAO9AC0AFACZ7UAGKAFo
ZPi1JZBodj7GEjdqgELTq0RC7xeSu1yv+dwEltQFPoSMGcbiTf0cGyzbreEAAAAAAAA=',
)

在文件名之后,您到底想要得到什么?在
…..
之前的3行?在寻求正则表达式支持时,通常最好提供多个示例输入,以表示输入的可变性。您当然不应该[yatta yatta]您的示例输入。我们需要能够在您的示例输入上运行测试代码。我们需要知道可能会显示多少空换行符,以及文本序列如何在您的文件中重复。谢谢。我明天将尝试并写回
var_export(
    preg_match_all(
        '~^filename="([^"]+)\.pdf"\s*([^=]+={1,2})~m',
        $fileContents,
        $out,
        PREG_SET_ORDER
    )
    ? array_column($out, 2, 1)
    : "no pdf's found"
);
array (
  '001235_0001' => 'JVBERi0xLjMNCjMgMCBvYmoNCjw8DQogIC9UeXBlIC9YT2JqZWN0DQogIC9TdWJ0eXBlIC9J
bWFnZQ0KICAvRmlsdGVyIC9EQ1REZWNvZGUNCiAgL1dpZHRoIDI0MDkNCiAgL0hlaWdodCAz
AF6UAFACZoAUUAFABQA1TQAuaADGKAFoASgBaACgBKADpTAQnApAJ0oAdQAdKAD2oAXpQA3p
.........................................
0oAU9KAFHFABQAnSgBOaAFoAKACgAoAWgAoATGOlAAKAFoATpQAYoAO9AC0AFACZ7UAGKAFo
ZPi1JZBodj7GEjdqgELTq0RC7xeSu1yv+dwEltQFPoSMGcbiTf0cGyzbreEAAAAAAAA=',
)