Php 用于分析最终收件人电子邮件头的正则表达式
我必须在以下两种情况之间获取任何文本: 最终收件人:RFC822!在这里行动 我需要!这里来自此示例。可能有任何字符串 我试过这样的方法:Php 用于分析最终收件人电子邮件头的正则表达式,php,regex,Php,Regex,我必须在以下两种情况之间获取任何文本: 最终收件人:RFC822!在这里行动 我需要!这里来自此示例。可能有任何字符串 我试过这样的方法: $Pattern = '/Final-Recipient: RFC822; (.*) Action/'; 但它不起作用 upd 这是我试图解析的字符串:因为您说的“任何字符串”可能包含空格,所以最接近的近似值是 $Pattern = '/Final-Recipient: RFC822; (.*?) Action/s'; #
$Pattern = '/Final-Recipient: RFC822; (.*) Action/';
但它不起作用
upd
这是我试图解析的字符串:因为您说的“任何字符串”可能包含空格,所以最接近的近似值是
$Pattern = '/Final-Recipient: RFC822; (.*?) Action/s';
# ^ ^
# lazy match instead of greedy match ----' |
# allow . to match newline -----'
当然,它不会匹配“最终收件人:RFC822;操作”您的模式对我来说很好:
$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!
)
还要注意,如果“任意文本”包含新行,则模式将失败。使用
/…/s
允许点也匹配新行。还要注意的是,如果文本“Action”出现在消息的其他地方,它将导致正则表达式失败。匹配点是危险的。如果可能的话,试着找到更具体的模式。我将建议一种不使用它们的方法,这需要额外的工作
<?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 roller@localhost ----- 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: <201004222335.o3MNZX5h059932@*.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);
有点晚了
但是有人问他如何解决一个不符合他要求的问题,也许他已经把多行连接到一行了?(imho)
这可能会帮助其他人
我假设op正在尝试解析传递状态通知的最终收件人标头字段
此处可以看到最终收件人字段的规范:
如果问题被解决,op可以将最终收件人字段作为单个字段(最终收件人后接下一行的字符/空行)拉入
e、 g
最后一个收件人后面是下一个字段的开头,下一行有一个。即后面没有空格或空行
然后他所要做的就是把线分开,然后再做第二部分
即
$Pattern='/最终收件人:[^;]+[| |如何定义结尾!在这里!?它总是用感叹号吗?在“Action/”后面的需要文本中,斜杠不是您原来的斜杠post@Ockonal我的字符串不好。谢谢!删除了答案。嗯,斜杠是正则表达式所需要的。原始文本是:最终收件人:RFC822;…请更新ActionLook。此regexp无效k表示给定的文本。说实话,可能只有电子邮件地址。任何新行。
Original-recipient: rfc822;some-email-that-does-not-exist@gmail.com
Final-recipient: rfc822;some-email-that-does-not-exist@gmail.com
Action: failed
Status: 5.1.1 (Remote SMTP server has rejected address)
String[] twoparts = "Final-recipient: rfc822;some-email-that-does-not-exist@gmail.com".split(";",2) // 2 here means (2-1) = 1 match
String email = twoparts[1]
$Pattern = '/Final-Recipient:[^;]+[;|<|\s]+([^\s|^<|^>]+)/i';
Final-Recipient: LOCAL;<example@rambler.ru>