Регулярное сплит-адрес электронной почты
мне нужна помощь с регулярным выражением php, я хочу "разделить" адрес электронной почты "johndoe@example.com" к "Джондо " и"example.com"
до сих пор у меня есть это: preg_match('/<?([^<]+?)@/', 'johndoe@example.com', $matches);
И я получаю Array ( [0] => johndoe@ [1] => johndoe)
Так, как мне нужно изменить регулярное выражение?
6 ответов
$parts = explode('@', "johndoe@example.com");
$user = $parts[0];
// Stick the @ back onto the domain since it was chopped off.
$domain = "@" . $parts[1];
некоторые из предыдущих ответов неверны, так как действительный адрес электронной почты может, по сути, включать более одного символа@, содержащего его в тексте с точечными разделителями. Рассмотрим следующий пример:
$email = 'a."b@c".d@e.f';
echo (filter_var($email, FILTER_VALIDATE_EMAIL) ? 'V' : 'Inv'), 'alid email format.'
корректный формат электронной почты.
Может существовать несколько блоков текста с разделителями и множество символов@. Оба примера являются допустимыми адресами электронной почты:
$email = 'a."b@c".d."@".e.f@g.h';
$email = '/."@@@@@@"./@a.b';
на основе Взрывной ответ Майкла Берковского, этот адрес электронной почты будет выглядеть так:
$email = 'a."b@c".d@e.f';
$parts = explode('@', $email);
$user = $parts[0];
$domain = '@' . $parts[1];
пользователь: a."b"
Домен: @с".d
Любой, кто использует это решение, должен остерегаться потенциальных злоупотреблений. Принятие адреса электронной почты на основе этих результатов с последующей вставкой $email в базу данных может иметь негативные последствия.
$email = 'a."b@c".d@INSERT BAD STUFF HERE';
содержание этих функций только точно покуда filter_var сначала используется для проверки.
слева:
вот простое не-регулярное выражение, не взрывающееся решение для поиска первого @, который не содержится в тексте с разделителями и цитатами. Вложенный текст с разделителями считается недопустимым на основе filter_var, поэтому поиск правильного @ - очень простой поиск.
if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
$a = '"';
$b = '.';
$c = '@';
$d = strlen($email);
$contained = false;
for($i = 0; $i < $d; ++$i) {
if($contained) {
if($email[$i] === $a && $email[$i + 1] === $b) {
$contained = false;
++$i;
}
}
elseif($email[$i] === $c)
break;
elseif($email[$i] === $b && $email[$i + 1] === $a) {
$contained = true;
++$i;
}
}
$local = substr($email, 0, $i);
$domain = substr($email, $i));
}
вот тот же код внутри функции.
function parse_email($email) {
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) return false;
$a = '"';
$b = '.';
$c = '@';
$d = strlen($email);
$contained = false;
for($i = 0; $i < $d; ++$i) {
if($contained) {
if($email[$i] === $a && $email[$i + 1] === $b) {
$contained = false;
++$i;
}
}
elseif($email[$i] === $c)
break;
elseif($email[$i] === $b && $email[$i + 1] === $a) {
$contained = true;
++$i;
}
}
return array('local' => substr($email, 0, $i), 'domain' => substr($email, $i));
}
In использовать:
$email = 'a."b@c".x."@".d.e@f.g';
$email = parse_email($email);
if($email !== false)
print_r($email);
else
echo 'Bad email address.';
Array ([local] => a."b@c".икс."@".д.е [домен] => @Ф.г )
$email = 'a."b@c".x."@".d.e@f.g@';
$email = parse_email($email);
if($email !== false)
print_r($email);
else
echo 'Bad email address.';
неверный адрес электронной почты.
справа:
после некоторого тестирования filter_var и исследования того, что приемлемо в качестве допустимого доменного имени (Хоста разделенных точками), я создал эту функцию, чтобы получить лучшую производительность. В действительном адресе электронной почты последний @ should будьте true @, так как символ @ никогда не должен появляться в домене действительного адреса электронной почты.
if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
$domain = strrpos($email, '@');
$local = substr($email, 0, $domain);
$domain = substr($email, $domain);
}
функции:
function parse_email($email) {
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) return false;
$a = strrpos($email, '@');
return array('local' => substr($email, 0, $a), 'domain' => substr($email, $a));
}
или с помощью explode и implode:
if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
$local = explode('@', $email);
$domain = '@' . array_pop($local);
$local = implode('@', $local);
}
функции:
function parse_email($email) {
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) return false;
$email = explode('@', $email);
$domain = '@' . array_pop($email);
return array('local' => implode('@', $email), 'domain' => $domain);
}
использование explode, вероятно, лучший подход здесь, но для этого с regex вы сделали бы что-то вроде этого:
/^([^@]*)(@.*)/
^ начало строки
([^@]*) все, что не является символом @ ($matches[0])
(@.*) @ символ, за которым следует что угодно ($matches[1])
Если вы хотите решение preg_match, вы также можете сделать что-то вроде этого
preg_match('/([^<]+)(@[^<]+)/','johndoe@example.com',$matches);
ответ
$parts = explode("@", $email);
$domain = array_pop($parts);
$name = implode("@",$parts);
Это решает оба случая Brogan edge (a."b@c".d."@".e.f@g.h
и /."@@@@@@"./@a.b
) Как вы можете видеть в это Ideone
на в настоящее время принимаются ответ недопустимо из-за множественного случая"@".
Я люблю @Броган пока я не прочитал его последнее предложение:
в действительном адресе электронной почты последний @ должен быть true @, так как символ @ никогда не должен появляться в домене действительного адреса электронной почты.
, что подтверждается этот и другие ответы. И если это правда, его ответ кажется излишне сложным.
использовать регулярные выражения. Например:
$mailadress = "email@company.com";
$exp_arr= preg_match_all("/(.*)@(.*)\.(.*)/",$mailadress,$newarr, PREG_SET_ORDER);
/*
Array output:
Array
(
[0] => Array
(
[0] => email@company.com
[1] => email
[2] => company
[3] => com
)
)
*/