e-posta adresinden özü adını almak için regex kullanarak

6 Cevap php

Metin benim dize bu gibi görünüyor

johndoe@domain.com (John Doe)

Ben @ ve başka bir şey daha önce sadece bir bölümünü almak gerekiyor. Herhangi konularda, metin basit bir xml nesne geliyor.

I var kodu şöyle

$authorpre = $key->{"author"};
$re1='((?:[a-z][a-z]+))';

if ($c=preg_match_all ("/".$re1."/is", $authorpre, $matches))
{
    $author=$matches[1][0];
}

Bazen adı regex görünüyor nerede durur, hangi @ simgesinden önce numaralarını veya bir çizgi olabilir.

6 Cevap

O @ karakteri ulaşıncaya kadar herhangi bir karakter maç ve çekeceği normal ifade:

([^@]+)

Yani ne gerek gibi görünüyor. Bu e-posta adreslerine garip varyasyonları her türlü hallederim.


Ben bunu benimkinden daha iyi hissediyorum çünkü neden Ben James, onun cevabını silinmez emin değilim. Ben (onun cevabını undeletes sürece) burada göndermek için gidiyorum:

Neden string fonksiyonları yerine regex kullanabilir?

$parts = explode("@", "johndoe@domain.com");
$username = $parts[0];

Siz tüm bu durumda normal ifadeleri gerekmez. Ben kullanarak explode şahsen, çok daha iyi bir seçenek olduğunu düşünüyorum.


Johannes Rössel yorumların işaret ettiği gibi, e-posta adresi ayrıştırma oldukça karmaşıktır. Eğer herhangi bir teknik-geçerli bir e-posta adresini ele almak mümkün olacak% 100 emin olmak istiyorsanız, benim cevap listelenen hem de çözümleri şok olacaktır, çünkü, düzgün bir alıntı idare edecek bir rutin yazmak zorunda gidiyoruz gibi adresleri "a@b"@example.com. Orada sizin için ayrıştırma bu tür işler bir kütüphane olabilir, ama ben bunun farkında değilim olabilir.

I $author = str_replace(strrchr($authorpre, '@'), '', $authorpre); ile gitmek istiyorum

@ OP, yalnızca @ önce her şeyi almak, sadece dize / dizi yöntemleri kullanmak istiyorsanız. Gerek regex karmaşık. "@" Üzerine patlayabilir, daha sonra etki parçası olan son öğeyi kaldırmak

$str = '"peter@john@doe"@domain.com (John Doe)';
$s = explode("@",$str);
array_pop($s); #remove last element.
$s = implode("@",$s);
print $s;

çıktı

$ php test.php
"peter@john@doe"

Explode () biraz daha yavaş bu varyant olabilir, ama bu sadece bir dize alabilir.

$name = preg_replace('/@.*?$/', '', $email);

Sen regexp ile mailparse_rfc822_parse_addresses to parse the address and extract just the address specification without any display name. Then, you could extract the part before @ kullanarak başlayabilirsiniz (.*)@.

Neden böyle bir şey kullanmıyor?

list($username,$domain) = explode('@',$email . "@"); // ."@" is a trick: look note below

Bu çözüm ile ull zaten bir satır e-posta adresi parçaları ile iki değişkenler doldurulan.

. "@": Bu liste komutu ile kısa kritik hataları önlemek, ve gerektiği gibi patlayacak en az 2 değişkenler üretecek sağlamak için yapılır.