3

To: および From: 生の電子メール ヘッダーには、多くの受け入れ可能な電子メール アドレス形式があるようです ...

person@place.com
person <person@place.com>
person
Another Person <person@place.com>
'Another Person' <person@place.com>
"Another Person" <person@place.com>

名前とアドレスを分割する効果的な PHP 関数が見つからなかったので、次のコードを作成しました。

コードパッドでDEMO ITを実行して、出力を確認できます...

// validate email address
function validate_email( $email ){
    return (filter_var($email, FILTER_VALIDATE_EMAIL)) ? true : false;
}

// split email into name / address
function email_split( $str ){
    $name = $email = '';
    if (substr($str,0,1)=='<') {
        // first character = <
        $email = str_replace( array('<','>'), '', $str );
    } else if (strpos($str,' <') !== false) {
        // possibly = name <email>
        list($name,$email) = explode(' <',$str);
        $email = str_replace('>','',$email);
        if (!validate_email($email)) $email = '';
        $name = str_replace(array('"',"'"),'',$name);
    } else if (validate_email($str)) {
        // just the email
        $email = $str;
    } else {
        // unknown
        $name = $str;
    }
    return array( 'name'=>trim($name), 'email'=>trim($email) );
}

// test it
$tests = array(
    'person@place.com',
    'monarch <themonarch@tgoci.com>',
    'blahblah',
    "'doc venture' <doc@venture.com>"
    );

foreach ($tests as $test){
    echo print_r( email_split($test), true );
}

ここで何か不足していますか?誰かがより良い方法をお勧めできますか?

4

4 に答える 4

1

これはどう:

function email_split($str) {
    $parts = explode(' ', trim($str));
    $email = trim(array_pop($parts), "<> \t\n\r\0\x0B");
    $name = trim(implode(' ', $parts), "\"\' \t\n\r\0\x0B");
    if ($name == "" && strpos($email, "@") === false) {             // only single string - did not contain '@'
        $name = $email;
        $email = "";
    }
    return array('name' => $name, 'email' => $email);
}

これは、正規表現ソリューションの約 2 倍の速さのようです。

注: OP の 3 番目のテスト ケース (私の目的では) は必要ありません。しかし、OPに答えるために、OPの期待される結果を生成するためにif stmtを追加しました。これは他の方法でも可能でした ('@' の $parts の最後の要素を確認してください)。

于 2015-12-23T20:30:01.050 に答える
0

PHP で preg_match を使用します。http://php.net/manual/en/function.preg-match.php

または、私の意見では、独自の関数を作成できます ( get_email_addressとしましょう)。それは@文字をキャッチし、 @から '<' 文字までの'rest-left-string' と@までの 'rest-right-string' を取得します。 「>」文字。

たとえば、stringmonarch <themonarch@tgoci.com>は 'rest-left-string' =themonarchおよび 'rest-right-string' =を返しtgoci.comます。最後に、関数get_email_addressはthemonarch@tgoci.comを返します。

うまくいけばそれは.. :)

于 2013-05-22T07:21:50.320 に答える