[英]Regular expression not working
當正文如下時,我正在嘗試從轉發的電子郵件中獲取和抄送該電子郵件:
$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:
$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>
電子郵件似乎正在影響正則表達式。 但是,它如何以及為什么不從頭開始影響它呢? 我怎樣才能解決這個問題?
問題是\\D*
匹配太多,即它也匹配換行符。 我在這里會更加嚴格。 為什么要完全使用\\D
(而不是數字)?
使用例如[^@]*
可以正常工作
cc: [^@]*\S([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})\S
在Regexr上看到它。
這樣,您可以確保第一部分與電子郵件地址不匹配。
\\D
也是原因,它適用於第一個“發件人”案例。 “日期”行中有數字,因此在該行中不匹配。
這樣嘗試
$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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.