1

メールアドレスを実際のリンクに置き換えるのに非常に役立つコードがあります。電子メール アドレスに複数のサフィックスがある場合があります (例: .co.uk と .com)。これらのシナリオごとに正規表現を作成できますが、正規表現の達人が 2 つを 1 つの式に組み合わせる方法を知っているかどうか知りたいです。もしそうなら、あなたの答えが何であり、なぜそれが機能するのかを説明していただけますか?

ここに私の現在のコードがあります -

$input = "here is a line of text, test@test.com, email@domain.com, email@domain.co.uk here";

preg_match_all('%\w+\@\w+\.\w+\.\w+%', $input, $matches);

$outmatch = Array();

if(is_array($matches[0])){
    foreach($matches[0] as $match){
        array_push($outmatch,$match);
    }
}

$outmatch = array_unique($outmatch);

if(is_array($outmatch)){
    foreach($outmatch as $outm){
        $input = str_replace($outm,'<a href="mailto:' . $outm . '">' . $outm . '</a>',$input);
    }
}

print $input;

2 サフィックスの式:%\w+\@\w+\.\w+\.\w+%

1 つのサフィックスの式:%\w+\@\w+\.\w+%

4

3 に答える 3

2

まず、この投稿では、メール アドレスを照合するための完全に一致する正規表現を開発することを目的としていません。質問者様のお役に立てれば幸いです。:)


次の正規表現は、少なくとも 1 つのドメインとその tld に一致しますが、複数のサブドメインを許可します。

preg_match_all('%\w+\@\w+\.\w+(\.\w+)?%', $input, $matches);

したがって、次のように一致します。

test@test.com

test@sub.test.com

test@subsub.sub.test.com

... 等々。しかし、それは一致しません:

test@test

.. tld がないためです。


さらに、有効な電子メール ユーザー名にはドットなどの文字が含まれている可能性があるため、考えられるすべてのアドレスと一致するとは.限り\wません。したがって、より良いパターンは次のようになります。

preg_match_all('%[a-zA-Z0-9._\%+-]+\@\w+\.\w+(\.\w+)?%', $input, $matches);

さらに注意してください :) 有効なドメイン名には、数字や特殊文字 ( -. これにより、次のような正規表現が得られます。

preg_match_all('%[a-zA-Z0-9._\%\+\-]+\@[a-zA-Z0-9\-]+\.\w+(\.\w+)?%', $input, $matches);

さらに注意してください:) :)有効な電子メールアドレスは次のようにもなります。

test@192.168.0.1

.. ドメイン名はありません。また、tld のない任意の電子メール アドレスが有効であることに注意してください。本当に一致する電子メールの正規表現を作成するのはそれほど簡単ではありません。

何度も詳しく説明されている Web から十分に文書化されたものを取得することをお勧めします。

于 2013-03-04T21:47:27.213 に答える
0

これはあなたのために働くかもしれません:%\w+\@(?:\w+\.)*\w+\.\w+%

必要な数のサブドメインまたは TLD を許可します。実際の動作を次に示します。

これ(?:\w+\.)*は、「ドットが続くサブドメインのゼロ回以上の出現」を意味します。は(?:一致しません。

于 2013-03-04T21:47:27.937 に答える
0

交互に使用してください ;)

preg_match_all('%\w+\@\w+\.\w+\.\w+|\w+\@\w+\.\w+%', $input, $matches);
于 2013-03-04T21:47:36.853 に答える