web-dev-qa-db-ja.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];
}

ユーザー名には、@記号の前に数字またはアンダースコアが含まれている場合があります。これは、正規表現が停止する場所と思われます。

28
mrpatg

@文字に到達するまで任意の文字を照合してキャプチャする正規表現:

([^@]+)

それはあなたが必要としているようです。これは、電子メールアドレスのあらゆる種類の異常なバリエーションを処理します。


Ben James が自分の答えを削除したのはなぜかわかりません。私はそれをここに投稿します(彼が彼の答えを元に戻す場合を除きます):

文字列関数の代わりに正規表現を使用する理由

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

この状況では、正規表現はまったく必要ありません。個人的には、explodeを使用する方がはるかに良いオプションだと思います。


JohannesRössel がコメントで指摘しているように、電子メールアドレスの解析はかなり複雑です。技術的に有効な電子メールアドレスをすべて処理できることを100%確実にしたい場合は、引用に適切に対処するルーチンを記述する必要があります。 "a@b"@example.comのようなアドレス。この種の解析を処理するライブラリがあるかもしれませんが、私はそれを知りません。

81
Welbog

@ OP、@の前のすべてを取得する場合は、文字列/配列メソッドを使用します。複雑な正規表現は必要ありません。 "@"で分解してから、ドメイン部分である最後の要素を削除します

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

出力

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

たぶん、このバリアントはexplode()より少し遅いですが、文字列は1つだけです:

$name = preg_replace('/@.*?$/', '', $email);
5
Leksat
<?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
?>

ソース

3
munjal

mailparse_rfc822_parse_addresses を使用してアドレスを解析し、表示名なしでアドレス指定のみを抽出することから始めます。次に、正規表現@を使用して(.*)@の前の部分を抽出できます。

2
markusk

$author = str_replace(strrchr($authorpre, '@'), '', $authorpre);を使用します

2
Arkh

私は preg_replace を使用しました

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

私のおすすめ:

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

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

このようなものを使用してください:

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

このソリューションでは、1つの行に電子メールアドレスの部分を含む2つの変数が既に入力されています。

."@":これは、listコマンドでの重大なエラーを回避し、explodeが必要に応じて少なくとも2つの変数を生成するようにするために行われます。

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

以下のパターンをテストしたところ、ピリオド、プラス、ダッシュを含むアドレスの最初の部分がわかりました。

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

また、ほとんどの場合に役立つ可能性があるため、ここでは正規表現以外のソリューションを提案したいと思います。

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

出力:

n.shah

0
Nabeel MS