我有这个字符串(例如)
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
)
这种模式有什么问题?
答案 0 :(得分:1)
问题在于第二个([^.]+)
。它在看到文件名中的.
后停止捕获。因此,按顺序使用(.+)
代替([^.]+)
来捕获所有剩余的字符
([^:]+):\s(.+)
我认为使用锚点会更好。
^([^:]+):\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(.+)$