1

我想让我的用户将一串电子邮件粘贴到文本中,然后在提交时将它们导入到数据库表中。

似乎电子邮件的典型语法以及通常在 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);

?>

至于电子邮件验证,在 php 5.2 及更高版本中,您可以使用filter_var($variable, FILTER_ID); 具体来说:

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 回答