2010-04-25 61 views
-1

我得之间的任何文本:正则表达式解析最终收件人的电子邮件标题

最终收件人:RFC822; !这里!动作

我需要!在这里!从这个例子。可能有任何字符串。

我想是这样的:

$Pattern = '/Final-Recipient: RFC822; (.*) Action/'; 

但它不工作。

UPD

这里是我试图解析字符串:既然你说 “任何字符串”,它可以包含空格,最接近的近似会http://dpaste.com/187638/

+0

你是如何定义的结束!在这里!?它总是在惊叹号吗? – 2010-04-25 19:44:12

+0

之后需要文字'Action /' – Ockonal 2010-04-25 19:45:09

+0

斜杠不在您的原始文章 – 2010-04-25 19:47:31

回答

2

你的模式能正常工作对我来说:

$i = 'This is a MIME-encapsulated message --o3ONXoEH01blah3:35:33 +0400 (MSD) Final-Recipient: RFC822; !HERE! Action: failed Status: 4.4.7 Lblahru> From: * 
@*.ru';  
$pattern = '/Final-Recipient: RFC822; (.*) Action/'; 
$matches = Array(); 
preg_match($pattern, $i, $matches); 
print_r($matches); 

输出:

Array 
(
    [0] => Final-Recipient: RFC822; !HERE! Action 
    [1] => !HERE! 
) 

还要注意的是,如果“任何文本”包含了新线的格局将失败。使用DOTALL modifier/.../s以允许点也匹配新行。另请注意,如果文本“Action”出现在消息的其他地方,则会导致正则表达式失败。匹配点是危险的。如果可能,尝试找到更具体的模式。

+0

说实话,可能只有电子邮件地址。任何换行符。 – Ockonal 2010-04-25 19:55:02

2

$Pattern = '/Final-Recipient: RFC822; (.*?) Action/s'; 
#          ^  ^
# lazy match instead of greedy match ----'   | 
#     allow . to match newline -----' 

当然它不会匹配"Final-Recipient: RFC822; Action Action"

+0

请更新。这个正则表达式不适用于给定的文本。 – Ockonal 2010-04-25 19:52:39

0

我打算建议一种不使用它们的方法,这需要额外的繁琐工作。

<?php 
$message = 'This is a MIME-encapsulated message --o3ONXoEH016763.1272152184/zvm19.host.ru The original message was received at Fri, 23 Apr 2010 03:35:33 +0400 (MSD) from [email protected] ----- The following addresses had permanent fatal errors ----- "Flucker" ----- Transcript of session follows ----- 451 grl.unibel.by: Name server timeout Message could not be delivered for 2 days Message will be deleted from queue --o3ONXoEH016763.1272152184/*.host.ru Content-Type: message/delivery-status Reporting-MTA: dns; zvm19.host.ru Arrival-Date: Fri, 23 Apr 2010 03:35:33 +0400 (MSD) Final-Recipient: RFC822; !HERE! Action: failed Status: 4.4.7 Last-Attempt-Date: Sun, 25 Apr 2010 03:36:24 +0400 (MSD) --o3ONXoEH016763.1272152184/zvm19.host.ru Content-Type: message/rfc822 Content-Transfer-Encoding: 8bit Return-Path: Received: (from *@localhost) by *.host.ru (8.13.8/Zenon/Postman) id o3MNZX5h059932; Fri, 23 Apr 2010 03:35:33 +0400 (MSD) (envelope-from *@roller.ru) Date: Fri, 23 Apr 2010 03:35:33 +0400 (MSD) Message-Id: <[email protected]*.host.ru> From: * 
@*.ru'; 
$left_delimiter = 'Final-Recipient: RFC822; '; 
$right_delimiter = ' Action'; 
$left_delimiter_pos = strrpos($message, $left_delimiter); 
$right_delimiter_pos = strpos($message, $right_delimiter); 
$desired_message_fragment = ''; 
if ($left_delimiter_pos !== false && $right_delimiter_pos !== false) { 
    $fragment_start = $left_delimiter_pos + strlen($left_delimiter); 
    $fragment_length = $right_delimiter_pos - $fragment_start; 
    $desired_message_fragment = substr(
     $message, $fragment_start, $fragment_length 
    ); 
} 
var_dump($desired_message_fragment); 
0

有点晚了....

但已被要求在如何解决的一个问题,是不是挺他的要求作品或许已经加入了多行到一行条款?(恕我直言)

这可能帮助别人....

我假设OP试图解析传递状态通知的最终收件人头字段。

为最终收件人场的规范可以在这里看到:http://tools.ietf.org/html/rfc3464#page-15

如果问题被分解,运能拉动最终收件人字段作为一个字段(最终收货人后跟一个字符/空白行在下一行。

Original-recipient: rfc822;[email protected] 
Final-recipient: rfc822;[email protected] 
Action: failed 
Status: 5.1.1 (Remote SMTP server has rejected address) 

最终收货人之后的下一个领域,行动具有下一行的开始。即不是后面有一个空格或空行。

然后他所要做的就是分开线路;并采取第二部分

String[] twoparts = "Final-recipient: rfc822;[email protected]".split(";",2) // 2 here means (2-1) = 1 match 
String email = twoparts[1] 
相关问题