我想让我的用户将一串电子邮件粘贴到文本中,并在提交时将它们导入到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,
如何使其更健壮,并在缺少名称时注意中断?电子邮件应该一直在那里!否则它只需要忽略一个实例并转到下一个联系人。但我想我可以在创建联系人数组后进行验证......
答案 0 :(得分: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
}
答案 1 :(得分: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
)
)
答案 2 :(得分: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
}
答案 3 :(得分:0)
preg_match("/<[a-zA-Z0-9\\-_\\.]@[a-zA-Z0-9\\-]\\.([a-z]{3})(\\.[a-z]{2})>/i", "", $emails);
问候,