30

私のテキスト文字列は次のようになります。

johndoe@domain.com (John Doe)

@の前の部分だけを取得する必要があります。重要な場合、テキストは単純なXMLオブジェクトから取得されます。

私が持っているコードは次のようになります:

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

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

ユーザー名の@記号の前に数字やアンダースコアが含まれている場合があります。これは、正規表現が停止しているように見える場所です。

4

13 に答える 13

94

文字に到達するまで任意の文字に一致してキャプチャする正規表現@

([^@]+)

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


ベン・ジェームスが彼の答えを削除した理由はわかりません。私よりも良いと思うからです。ここに投稿します(彼が回答の削除を取り消さない限り):

文字列関数の代わりに正規表現を使用するのはなぜですか?

$parts = explode("@", "johndoe@domain.com");
$username = $parts[0];

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


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

于 2009-11-25T17:01:27.443 に答える
7

@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"
于 2009-11-26T00:47:51.163 に答える
6

このバリアントは、explode() よりも少し遅いかもしれませんが、1 つの文字列しか必要としません:

$name = preg_replace('/@.*?$/', '', $email);
于 2011-06-13T17:00:55.900 に答える
4
<?php
$email  = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // prints @example.com

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

ソース

于 2015-06-29T12:05:17.203 に答える
2

私は一緒に行きます$author = str_replace(strrchr($authorpre, '@'), '', $authorpre);

于 2009-11-25T17:30:46.937 に答える
2

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

于 2009-11-25T18:22:30.327 に答える
-1

以下のパターンをテストしたところ、ピリオド、プラス、ダッシュを含む住所の最初の部分が得られました。

if ($c = preg_match_all ('^([\w\.\+\-]*)', $authorpre, $matches))
于 2019-08-14T16:38:01.443 に答える