php - 如何在内容处置 header 中预匹配所有三种情况?

标签 php regex preg-match

我正在尝试解码内容配置 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/

相关文章:

php - 解析嵌套的 JSON 以检索嵌套的数组值

java - 匹配到逗号前最后 3 个字符的正则表达式

php - 这些正则表达式模式不同吗?

php - Yii2 登录。 Yii::$app->user->login($user, 0) 不保存

php - SQL 查询返回与当前或该月最后一天匹配的行

javascript - 如何使用脚本在php中获取搜索值

c++ - 索引文件名及其内容

javascript - 从扩展对象javascript创建 key 对对象

php - 正则表达式匹配 2 个或更多单词

php - 包括特殊字符在内的任何英文 ASCII 字符的正则表达式