Использование 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];
}
Иногда имя пользователя может иметь числа или знак подчеркивания перед символом @, где останавливается регулярное выражение.
Ответы
Ответ 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))