提取两个字符之间的字符串

4
我有一个输出字符串,格式如下: Fname Lname<fname@urmail.com>。我想从中提取电子邮件地址。我应该如何做?
4个回答

13

如果您能确保字符串格式一致,那么一个简单的正则表达式就可以解决问题:

$input = 'Fname Lname<fname@urmail.com>';
preg_match('~<(.*?)>~', $input, $output);
$email = $output[1];

var_dump($output) 的结果是 array(0) { }。 - AssamGuy
@Tatu,可以使用否定字符类和贪婪量词,而不是懒惰量词。 - mickmackusa

3
不要重复造轮子,使用解析器。专业人士使用mailparse_rfc822_parse_addresses()来完成这个特定的任务,他们深入了解此主题(以及您可能遇到的问题)。
文档中的示例#1:
$to = 'Wez Furlong <wez@example.com>, doe@example.com';
var_dump(mailparse_rfc822_parse_addresses($to));

给出(应用了轻微的格式化):
array(2) {
  [0] => array(3) {
    ["display"] => string(11) "Wez Furlong"
    ["address"] => string(15) "wez@example.com"
    ["is_group"] => bool(false)
  }
  [1] => array(3) {
    ["display"] => string(15) "doe@example.com"
    ["address"] => string(15) "doe@example.com"
    ["is_group"] => bool(false)
  }
}

参见:imap_rfc822_parse_adrlist()Full name with valid email

请注意,mailparse是一个未捆绑在PHP中的PECL扩展。否则,这是正确的方法。 - Tatu Ulmanen
@Tatu Ulmanen 确实。php-imap扩展可能已经存在,参见更新的答案。 - jensgram

1
使用像substring和explode这样的函数(比正则表达式更简单的方法,可以解决问题):
<?php
$text = 'Fname Lname<fname@urmail.com>';
$pieces = explode('<',$text);
$mail=substr($pieces[1],0,-1);
echo $mail;
?>

-1

这应该打印电子邮件地址:

if (preg_match("/<\S*>/", $subject, $matches)) {
  echo "E-Mail address: ".$matches[0];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接