我正在尝试解码内容配置 header (来自 curl)以使用以下正则表达式获取文件名:
<?php
$str = 'attachment;filename="unnamed.jpg";filename*=UTF-8\'\'unnamed.jpg\'';
preg_match('/^.*?filename=(["\'])([^"\']+)\1/m', $str, $matches);
print_r($matches);
因此,如果文件名在单引号或双引号中它会匹配,但如果文件名周围没有引号(这可能会发生),它会失败
$str = 'attachment;filename=unnamed.jpg;filename*=unnamed.jpg';
现在我正在使用两个正则表达式(带有 if-else),但我只是想了解是否可以在单个正则表达式中执行此操作?仅供我自己学习掌握正则表达式。
最佳答案
我将使用 branch reset 功能 (?|...|...|...)
提供更易读的模式并避免创建报价的捕获组。在分支重置组中,每个捕获组的每个备选方案都具有相同的编号:
if ( preg_match('~filename=(?|"([^"]*)"|\'([^\']*)\'|([^;]*))~', $str, $match) )
echo $match[1], PHP_EOL;
无论哪种选择成功,捕获总是在组 1 中。
关于php - 如何在内容处置 header 中预匹配所有三种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48240521/