it-roy-ru.com

Использование регулярных выражений для извлечения имени пользователя из адреса электронной почты

Моя строка текста выглядит так:

[email protected] (John Doe)

Мне нужно получить только часть до @ и ничего больше. Текст исходит из простого объекта XML, если это имеет значение.

Код у меня выглядит так:

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

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

Иногда имя пользователя может иметь цифры или подчеркивание перед символом @, где, по-видимому, и останавливается регулярное выражение.

27
mrpatg

Регулярное выражение, которое будет соответствовать и захватывать любой символ, пока не достигнет символа @:

([^@]+)

Это похоже на то, что вам нужно. Он будет обрабатывать все виды причудливых вариаций адресов электронной почты.


Я не уверен, почему Бен Джеймс удалил свой ответ, так как чувствую, что он лучше моего. Я собираюсь опубликовать это здесь (если он не отменяет свой ответ):

Зачем использовать регулярные выражения вместо строковых функций?

$parts = explode("@", "[email protected]");
$username = $parts[0];

Вам не нужны регулярные выражения в этой ситуации вообще. Я думаю, что использование explode лично для меня намного лучше.


Как отмечает Johannes Rössel в комментариях, разбор адресов электронной почты довольно сложен. Если вы хотите быть на 100% уверены, что сможете обработать любой технически действительный адрес электронной почты, вам придется написать процедуру, которая будет правильно обрабатывать цитирование, потому что оба решения, перечисленные в моем ответе, будут подавлены адреса, такие как "[email protected]"@example.com. Может быть, есть библиотека, которая обрабатывает такой анализ для вас, но я не знаю об этом.

77
Welbog

@OP, если вы хотите получить все до @, просто используйте методы строки/массива. Не нужно сложное регулярное выражение. Разбить на «@», затем удалить последний элемент, являющийся частью домена

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

Результат

$ php test.php
"[email protected]@doe"
6
ghostdog74

Возможно, этот вариант немного медленнее, чем explode (), но он занимает только одну строку:

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

Вы можете начать с использования mailparse_rfc822_parse_addresses для анализа адреса и извлечения только спецификации адреса без отображаемого имени. Затем вы можете извлечь часть перед @ с помощью регулярного выражения (.*)@.

2
markusk

Я бы пошел с $author = str_replace(strrchr($authorpre, '@'), '', $authorpre);

2
Arkh
<?php
$email  = '[email protected]';
$domain = strstr($email, '@');
echo $domain; // prints @example.com

$user = strstr($email, '@', true); // As of PHP 5.3.0
echo $user; // prints name
?>

источник

2
munjal

Я использовал preg_replace

$email_username = preg_replace('/@.*/', '', $_POST['email']);
1
michalzuber

Используйте что-то вроде этого:

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

С этим решением вы уже заполнили две переменные с частями адреса электронной почты в одной строке.

."@": Это сделано для того, чтобы избежать коротких критических ошибок с помощью команды list и гарантировать, что explode выдаст как минимум две переменные по мере необходимости.

1
kante

Основной пример:

    $email = "[email protected]";
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
        list($user, $domain) = explode('@', trim($email) . "@");
    } else {
        echo "Unable to get account info ....";
    }

Сложный пример: Что-то вроде этого для заполнения полей Имя и Фамилия:

1) valid email ?  if yes get the two parts  user and domain.
2) else set to something default etc.
3) use the email address if we don't have a decoded value.

Код:

    if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
        list($fname, $lname) = explode('@', trim($email) . "@");
    } else {
        $fname = "Xdefault";
        $lname = "Ydefault";
    }

    $fname = (!empty($decoded['firstname'][0]))  ? $decoded['firstname'][0] : $fname ;
    $lname = (!empty($decoded['lastname'][0]))  ? $decoded['lastname'][0] : $lname ;
0
Mike Q

Мое предложение:

$email = '[email protected]';
$username = substr($email, 0, strpos($email, '@'));

// Output (in $username): johndoe
0
webcoder