正则表达式不起作用

时间:2013-02-26 18:44:32

标签: php regex preg-match

我试图从转发的电子邮件中收到电子邮件和cc,当正文如下:

$body = '-------
Begin forwarded message:


From: Sarah Johnson <blabla@gmail.com>

Subject: email subject

Date: February 22, 2013 3:48:12 AM

To: Email Recipient <thatwouldbe@yayyy.com>

Cc: Ralph Johnson <johnson@gmail.com>


Hi,


hello, thank you and goodbye!

 blabla@gmail.com'

现在,当我执行以下操作时:

$body = strtolower($body);
$pattern = '#from: \D*\S([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})\S#';
if (preg_match($pattern, $body, $arr_matches)) {
     echo htmlentities($arr_matches[0]);
     die();
}

我正确地得到了:

from: sarah johnson <blabla@gmail.com>

现在,为什么cc不起作用?我做了一些非常相似的事情,只是改为cc:

$body = strtolower($body);
$pattern = '#cc: \D*\S([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})\S#';
if (preg_match($pattern, $body, $arr_matches)) {
     echo htmlentities($arr_matches[0]);
     die();
}

我得到了:

cc: ralph johnson <johnson@gmail.com> hi, hello, thank you and goodbye! blabla@gmail.com

如果我从原始页脚中删除电子邮件(删除blabla@gmail.com),那么我正确地得到:

cc: ralph johnson <johnson@gmail.com>

看起来电子邮件正在影响正则表达式。但是怎么样,为什么不影响它呢?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

问题是,\D*匹配太多,即它也匹配换行符。我在这里会更加严格。你为什么一直使用\D(不是数字)?

例如[^@]*它正在运作

cc: [^@]*\S([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})\S

here on Regexr

这样,您确定第一部分与电子邮件地址不匹配。

这个\D也是原因,它适用于第一个“From”案例。 “日期”行中有数字,因此它与此行不匹配。

答案 1 :(得分:1)

试试这个

$body = '-------
Begin forwarded message:


From: Sarah Johnson <blabla@gmail.com>

Subject: email subject

Date: February 22, 2013 3:48:12 AM

To: Email Recipient <thatwouldbe@yayyy.com>

Cc: Ralph Johnson <johnson@gmail.com>


Hi,


hello, thank you and goodbye!

 blabla@gmail.com';

$pattern = '#(?:from|Cc):\s+[^<>]+<([^@]+@[^>\s]+)>#is';
preg_match_all($pattern, $body, $arr_matches);
echo '<pre>' . htmlspecialchars(print_r($arr_matches, 1)) . '</pre>';

输出

Array
(
    [0] => Array
        (
            [0] => From: Sarah Johnson <blabla@gmail.com>
            [1] => Cc: Ralph Johnson <johnson@gmail.com>
        )

    [1] => Array
        (
            [0] => blabla@gmail.com
            [1] => johnson@gmail.com
        )

)

$arr_matches[1][0] - "From" email
$arr_matches[1][1] - "Cc" email