REGEX - 忽略换行符

REGEX - ignore new line characters

我遇到了这行代码:

preg_match_all("!boundary=(.*)$!mi", $content, $matches);

但是

Content-Type: multipart/alternative; boundary=f403045e21e067188c05413187fd\r\n

它returns

f403045e21e067188c05413187fd\r

什么时候应该 return

f403045e21e067188c05413187fd

(没有 \r

有什么解决办法吗?

PS.: 它也应该适用于 \r 不存在的情况,只有 \n

将表达式更改为

preg_match_all("!boundary=(.*)\r?$!mi", $content, $matches);

如果存在,应该删除 \r。

已编辑:\r 需要在 RegExp 中转义。

有两种选择。

  1. 使用惰性点匹配并添加一个可选的\r:

    preg_match_all("!boundary=(.*?)\r?$!mi", $content, $matches);

this PHP demo

  1. 使用 [^\r\n] 否定字符 class 匹配任何字符,但 \r\n:

    preg_match_all("!boundary=([^\n\r]*)!mi", $content, $matches);

或者,更短的版本,使用 \V shorthand 字符 class 匹配任何不是垂直空格的字符(不是换行字符):

preg_match_all("!boundary=(\V*)!mi", $content, $matches);

this or this PHP demo

注意第二种方法效率更高。