Content-Disposition Regex模式不起作用

时间:2014-10-18 17:55:27

标签: php regex

我有这个字符串(例如)

Content-Disposition: attachment; filename="Eminem - Not Afraid1.3gp"

并在preg_match()

上使用此模式
([^.]+)\:\s([^.]+)

我想要的是:

Array
(
    [0] => Content-Disposition: attachment; filename="Eminem - Not Afraid1.3gp"
    [1] => Content-Disposition
    [2] => attachment; filename="Eminem - Not Afraid1.3gp"
)

但是我得到了

Array
(
    [0] => Content-Disposition: attachment; filename="Eminem - Not Afraid1
    [1] => Content-Disposition
    [2] => attachment; filename="Eminem - Not Afraid1
)

这种模式有什么问题?

2 个答案:

答案 0 :(得分:1)

问题在于第二个([^.]+)。它在看到文件名中的.后停止捕获。因此,按顺序使用(.+)代替([^.]+)来捕获所有剩余的字符

([^:]+):\s(.+)

DEMO

我认为使用锚点会更好。

^([^:]+):\s(.+)$

<强>解释

^                        the beginning of the string
(                        group and capture to \1:
  [^:]+                    any character except: ':' (1 or more
                           times)
)                        end of \1
:                        ':'
\s                       whitespace (\n, \r, \t, \f, and " ")
(                        group and capture to \2:
  .+                       any character except \n (1 or more
                           times)
)                        end of \2
$                        before an optional \n, and the end of the
                         string

答案 1 :(得分:1)

首先,我会将您的第一个否定字符类从点更改为冒号。冒号也不需要在类之外转义,它不是特殊含义的字符。然后你可以匹配点.和之后的一切,直到字符串结束。我建议也要锚定你的正则表达式......

^([^:]+):\s([^.]+\..+)$

或者简单地匹配第二个捕获组内的其余字符串......

^([^:]+):\s(.+)$

Code Demo