【问题标题】:preg_match issue (not parsing as I expected)preg_match 问题(没有像我预期的那样解析)
【发布时间】:2012-05-28 15:05:02
【问题描述】:

我正在解析邮件标头,并且正在寻找“boundary=...”参数。

$content = '..Content-Type: multipart/alternative;
    boundary="----=_NextPart_000_10CD_01CD3CB2.7C22E7C0"
X-Mailer: Microsoft CDO for Windows 2000..'

我正在使用以下方法,但它们都不起作用:

    $boundary = preg_replace('#(.*)boundary="(.*)"(.*)#is',"$2",$content);

    $boundary = preg_replace('#boundary="(.*)"#i',"$2",$content);

第一行返回:

NextPart_000_10CD_01CD3CB2.7C22E7C0"
X-Mailer: Microsoft CDO for Windows 2000

而第二个:

Content-Type: multipart/alternative;
    ----=_NextPart_000_10CD_01CD3CB2.7C22E7C0
X-Mailer: Microsoft CDO for Windows 2000

我了解第二行的作用,并且它正确地做到了。但是当第一行不解析第二个双引号时,我不明白。有什么想法吗?

【问题讨论】:

  • 您到底想做什么,使用 preg_match 匹配还是使用 preg_replace 替换?你把它弄混了。
  • 我并没有真正使用它来替换,而是我猜想是为了匹配
  • 你的问题真的让我意识到我必须使用 preg_match,我的错:preg_match('#boundary="(.*)"#i',$content,$m);
  • 那么究竟是什么在这里不起作用?它似乎匹配得很好
  • 您是否已经考虑过使用现有的库(例如 Mailparse)来执行此操作?

标签: php regex pcre


【解决方案1】:
preg_match('/boundary="([^"]+)"/m', $content, $m);
echo $m[1]; // ----=_NextPart_000_10CD_01CD3CB2.7C22E7C0

【讨论】:

    【解决方案2】:

    我终于可以使用否定匹配器 [^"]*

    解决它
    $boundary = preg_replace('#(.*)boundary="([^"]*)(.*)#is',"$2",$content);
    

    但如果有人知道我的问题的答案,我们将不胜感激。我不完全理解与 s 修饰符一起使用的 (.*) 的行为

    【讨论】:

      【解决方案3】:

      在您的自我回答中回答您的问题:

      .*,与s 修饰符一起使用时,还包括换行符iirc。

      http://us3.php.net/manual/en/reference.pcre.pattern.modifiers.php

      s (PCRE_DOTALL)

      如果设置了此修饰符,则模式中的点元字符匹配所有字符,包括换行符。没有它,换行符被排除在外。这个修饰符等价于 Perl 的 /s 修饰符。诸如 [^a] 之类的否定类始终匹配换行符,与此修饰符的设置无关。

      【讨论】:

        猜你喜欢
        • 2022-07-06
        • 1970-01-01
        • 2016-06-19
        • 2013-04-11
        • 1970-01-01
        • 2021-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多