1

ユーザーがメールの文字列をテキストに貼り付け、送信時にそれらを db テーブルにインポートできるようにしたいと考えています。

電子メールの典型的な構文のようで、通常 TO フィールドに入力される方法は次のとおりです。

"Fname Lname" <abc@email.com>, "Fname Lname" <abc@gmail.com>,

送信時に、ループを介して解析する必要があると思います。名前と電子メールのペアの破損を検出するにはどうすればよいですか? 基本的な電子メール検証も行う方法はありますか?


アップデート:

名前が欠落しているなど、文字列がわずかにずれている場合があることに気付きました。

Fname Lname" <abc@email.com>, abc@gmail.com,

あるいは

<abc@email.com>, abc@gmail.com,

あるいは

abc@email.com, abc@gmail.com,

名前が欠落している場合、それをより堅牢にしてメモを破るにはどうすればよいですか? メールは常にそこにあるはずです!それ以外の場合は、インスタンスを無視して次の連絡先に進む必要があります。しかし、連絡先の配列が作成された後にその検証を行うことができると思います...

4

4 に答える 4

2

苦手なpreg_matchので別の方法でやってみました。文字列が常にこのパターンである場合は、次のようなことを試すことができます。

$str = '"Fname Lname" <abc@email.com>, "Fname Lname" <xyz@gmail.com>';

$pairs = explode( ",", $str );

foreach( $pairs as $pair ) {

  $pair = explode( "<", $pair );
  $pair['0'] = trim( str_replace( "\"", "", $pair['0'] ) );
  $pair['1'] = trim( rtrim( $pair['1'], ">" ) );

  print_r( $pair ); // Save it to database here
}

ここでテスト

編集:

(入力文字列の変更)

$str = '"Fname Lname" <abc@email.com>, abc@gmail.com';

$pairs = explode( ",", $str );

foreach( $pairs as $pair ) {

  if( strpos($pair, '<') ) {

    $output = explode( "<", $pair );
    $output['0'] = trim( str_replace( "\"", "", $output['0'] ) );
    $output['1'] = trim( rtrim( $output['1'], ">" ) );

  } else {

    $output = array();
    $output['0'] = '';
    $output['1'] = $pair;

  }

  print_r($output); // Save it to database here
}

ここでテスト

于 2012-05-19T04:05:42.423 に答える
1

preg_match_all()forを使用してそれを行うことができます:

PHP の例

<?php

$string = '"Fname Lname" <abc@email.com>, "Fname Lname" <abc@email.com>,';
preg_match_all('!"(.*?)"\s+<\s*(.*?)\s*>!', $string, $matches);
$arr = array();
for ($i=0; $i<count($matches[0]); $i++) {
  $arr[] = array(
    'name' => $matches[1][$i],
    'email' => $matches[2][$i],
  );
}

?>

出力:

print_r($arr);

Array (
  [0] => Array (
    [name] => Fname Lname
    [email] => abc@email.com
  )
  [1] => Array (
    [name] => Fname Lname
    [email] => abc@email.com
  )
) 
于 2012-05-19T03:49:34.547 に答える
1

次の正規表現は、名前とサブ配列の電子メールの両方を持つ配列を、キー[1][2]それぞれに作成します。

<?php

$data = '"Fname Lname" <abc@email.com>, "Fname Lname" <abc@gmail.com>,';
preg_match_all('/\"(.*?)\"\s\<(.*?)\>/', $data, $arr, PREG_PATTERN_ORDER);
print_r($arr);

?>

filter_var($variable, FILTER_ID)電子メールの検証に関しては、php 5.2 以降では;を使用できます。具体的には:

if (filter_var($email_string, FILTER_VALIDATE_EMAIL)) { 
    // do stuff
}

ここで説明します

于 2012-05-19T03:51:21.407 に答える
0
preg_match("/<[a-zA-Z0-9\\-_\\.]@[a-zA-Z0-9\\-]\\.([a-z]{3})(\\.[a-z]{2})>/i", "", $emails);

ご挨拶、

于 2012-05-19T03:50:06.747 に答える