Nasıl e-posta ayrıştırma için bu RegEx PHP çalışır?

3 Cevap php

Tamam, ben şu iki formların bir e-posta adresi ayıklamak için aşağıdaki PHP kodu vardır:

Random Stranger <email@domain.com>
email@domain.com

Burada PHP kodu:

// The first example
$sender = "Random Stranger <email@domain.com>";

$pattern = '/([\w_-]*@[\w-\.]*)|.*<([\w_-]*@[\w-\.]*)>/';

preg_match($pattern,$sender,$matches,PREG_OFFSET_CAPTURE);

echo "<pre>";
print_r($matches);
echo "</pre><hr>";

// The second example
$sender = "user@domain.com";

preg_match($pattern,$sender,$matches,PREG_OFFSET_CAPTURE);

echo "<pre>";
print_r($matches);
echo "</pre>";

Sorum ... $matches ne olduğunu? Bu diziler garip bir koleksiyon gibi görünüyor. Hangi dizin parantez gelen maç tutar? Ben nasıl e-posta adresi ve only e-posta adresini alıyorum emin olabilirim?

Update:

İşte çıktı:

Array
(
    [0] => Array
        (
            [0] => Random Stranger 
            [1] => 0
        )

    [1] => Array
        (
            [0] => 
            [1] => -1
        )

    [2] => Array
        (
            [0] => user@domain.com
            [1] => 5
        )

)
Array
(
    [0] => Array
        (
            [0] => user@domain.com
            [1] => 0
        )

    [1] => Array
        (
            [0] => user@domain.com
            [1] => 0
        )

)

3 Cevap

Bu gebelik soru ile size yardımcı olmuyor ama kodunuzu basitleştirmek olacaktır. Bu sadece 2 seçenek olduğundan, normal ifadeler kullanmak Yüklü

echo end( explode( '<', rtrim( $sender, '>' ) ) );

Aşağıdaki http://us.php.net/preg_match de yardım doc doğrudan kopyalanır

Karşılaşmalar sağlanır, o zaman arama sonuçları ile doldurulur. $ Karşılaşmalar [0] full desen, $ maçı [1] böylece ilk yakalanan parantez dizilimi eşleşen metin var ve olacak eşleşen metni içerecektir.

preg_match() kılavuz sayfası $matches nasıl çalıştığını açıklar. Onlar eşleşen için, kendi regexp herhangi bir bracketed sub-expression sonuçları ile doldurulur isteğe bağlı bir parametre var. $matches[0] alt ifadeleri ardından, her zaman tüm ifade maç.

Yani, örneğin, bu model iki alt-ifade, ([\w_-]*@[\w-\.]*) ve ([\w_-]*@[\w-\.]*) içerir. Bu iki ifadeler eşleşen parçalar sırasıyla, $matches[1] ve $matches[2] girecek. Ben e-posta adresi için Random Stranger <email@domain.com>, sen böyle bir şey var ki hızlı bir bakışta sonra sanırım $matches olacaktır:

Array( 
    0 => "Random Stranger <email@domain.com>",
    1 => "Random Stranger",
    2 => "email@domain.com"
)

Eşleşen tüm alt parçaları ile doldurulur referans $matches adlı bir dizi, geçen olarak düşünün.

Edit - Sen $matches doldurulur nasıl davranışını değiştirir PREG_OFFSET_CAPTURE bayrağını kullanıyorsanız unutmayın, böylece sonuç benim örnek maç olmayacak. Manuel Bu bayrak da yakalama nasıl değiştirdiğini anlatıyor. Bu durumda, yerine eşleşen alt ifadeleri bir dizi, bunu dize bulunmuştur konumu ile her ifade çok boyutlu bir dizi olsun.