Подтвердить что ты не робот

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

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

[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];
}

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

4b9b3361

Ответ 1

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

([^@]+)

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


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

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

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

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


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

Ответ 2

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

$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"

Ответ 3

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

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

Ответ 4

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

источник

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

// Output (in $username): johndoe

Ответ 9

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

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

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

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

Ответ 10

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

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

Ответ 11

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

strstr('[email protected]', '@', true)

выход:

n.shah

Ответ 12

Я протестировал шаблон, приведенный ниже, и он дает мне начальную часть адреса, включая точки, плюсы и тире.

if ($c = preg_match_all ('^([\w\.\+\-]*)', $authorpre, $matches))