Final-mailleri başlığı ayrıştırmak için normal ifade

4 Cevap php

Ben arasında herhangi bir metin almak zorunda:

Final-Alıcı: RFC822; ! BURAYA! Eylem

Ben bu örnekten !HERE! gerekir. Herhangi bir dize var olabilir.

Ben böyle bir şey denedim:

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

Ama çalışmıyor.

upd

İşte ayrıştırmak çalışıyorum dizedir: http://dpaste.com/187638/

4 Cevap

Sizin desen benim için çalışıyor:

$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);

Çıktı:

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

"Herhangi bir yazı," yeni satırları içeriyorsa eğer desen başarısız olacağını da unutmayın. Ayrıca yeni nokta çizgiler maç için izin vermek üzere DOTALL modifier /.../s kullanın. Ayrıca metin "Eylem" başka iletide görünür eğer düzenli ifade başarısız olmasına neden olacağını unutmayın. Eşleştirme nokta tehlikelidir. Mümkünse daha özel bir desen bulmak için çalışın.

Eğer boşluk içerebilir "herhangi bir dize" dedi yana, yakın yaklaşık olacaktır

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

Tabii ki "Final-Recipient: RFC822; Action Action" maç olmayacak.

Ben ekstra busywork gerektirir, bunları kullanmayan bir yöntem önermek için gidiyorum.

<?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);

biraz geç ....

ama Op belki bir hat üzerine birden fazla satır katıldı oldukça onun gereksinimleri olmayan bir sorunu çözmek için nasıl açısından talep edilmiştir? (IMHO).

Bu başkalarına yardımcı olabilir ....

Ben op bir teslim durumu bildirimi Final-Alıcı başlık alanı ayrıştırmak çalışıyor varsayarak yaşıyorum.

Final-Alıcı alanı için spec burada görülebilir: http://tools.ietf.org/html/rfc3464#page-15

Sorun aşağı kırılırsa, op sonraki satırda bir karakter / boş bir satır tek bir alanda (Final alıcı olarak nihai alıcı alanını indirebiliriz.

örneğin

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)

Nihai alıcı sonraki satırda A olan sonraki alana, Eylem başlangıcında tarafından takip edilir. yani bir boşluk ya da boş bir satır yok.

o zaman yapmanız gereken tüm üzerinde çizgi bölünmüş olduğunu; ve ikinci bir kısmını alacak

yani

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]