【问题标题】:REGEX - ignore new line charactersREGEX - 忽略换行符
【发布时间】:2017-03-27 12:04:07
【问题描述】:

我遇到了这行代码:

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

但对于

内容类型:多部分/替代; 边界=f403045e21e067188c05413187fd\r\n

返回

f403045e21e067188c05413187fd\r

什么时候返回

f403045e21e067188c05413187fd

(没有\r)

任何想法如何解决这个问题?

PS.:当\r 不存在时它也应该工作,只有\n

【问题讨论】:

  • \r 和 \n 是文字还是换行符?

标签: php regex email-headers


【解决方案1】:

有两种选择。

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

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

见this PHP demo

  1. 使用[^\r\n] 否定字符类匹配除\r 和\n 之外的任何字符:

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

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

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

见this 或this PHP demo。

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

【讨论】:

  • 对,我还在检查模式,只是停在\N。 \V 也在工作。
  • 第一个工作正常,第二个没试过。谢谢!
  • 我宁愿推荐其他两个更快的选项。我从第一个开始,展示如何“固定”你的模式。
  • 根据建议,我切换到"!boundary=(\V*)!mi" 也可以正常工作
【解决方案2】:

将表达式改为

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

如果存在的话,应该去掉 \r。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
相关资源
最近更新 更多