从字符串中提取电子邮件地址 - php

Liz*_*iz. 17 php

我想从字符串中提取电子邮件地址,例如:

<?php // code
$string = 'Ruchika <ruchika@example.com>';
?>
Run Code Online (Sandbox Code Playgroud)

从上面的字符串我只想获得电子邮件地址ruchika@example.com.

请注意,建议如何实现这一目标.

Nir*_*aju 27

试试这个

<?php 
    $string = 'Ruchika < ruchika@example.com >';
    $pattern = '/[a-z0-9_\-\+\.]+@[a-z0-9\-]+\.([a-z]{2,4})(?:\.[a-z]{2})?/i';
    preg_match_all($pattern, $string, $matches);
    var_dump($matches[0]);
?>
Run Code Online (Sandbox Code Playgroud)

这里的演示

第二种方法

<?php 
    $text = 'Ruchika < ruchika@example.com >';
    preg_match_all("/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i", $text, $matches);
    print_r($matches[0]);
?>
Run Code Online (Sandbox Code Playgroud)

在这里演示

  • 仅供参考 - 仅适用于基本域名,例如gmail.com.它适用于邮件子域名的电子邮件地址,例如email@mg.website.com (2认同)

Jac*_*ues 24

解析电子邮件地址是一项疯狂的工作,会导致非常复杂的正则表达式.例如,请考虑使用此官方正则表达式来捕获电子邮件地址:http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

太棒了吧?

相反,有一个标准的PHP函数来执行此操作mailparse_rfc822_parse_addresses(),在此处进行调用和记录.

它接受一个字符串作为参数,并返回一个关联数组数组,其中包含键display,address和is_group.

所以,

$to = 'Wez Furlong <wez@example.com>, doe@example.com';
var_dump(mailparse_rfc822_parse_addresses($to));
Run Code Online (Sandbox Code Playgroud)

会屈服:

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @ftrotter 是的,它无意这样做,这也不是OP 所要求的。它的目的是从列表中提取电子邮件地址,例如邮件信封中的电子邮件地址。 (3认同)
  • 这是从电子邮件地址列表中获取电子邮件地址的好方法,但它在随机自由文本中的电子邮件地址上效果不佳...... (2认同)

jul*_*anm 6

这是基于 Niranjan 的回复,假设您将输入电子邮件包含在 < 和 > 字符中)。在这里我没有使用正则表达式来获取电子邮件地址,而是获取 < 和 > 字符之间的文本部分。否则,我使用字符串来获取整个电子邮件。当然,我没有对电子邮件地址进行任何验证,这取决于您的情况。

<?php 
    $string = 'Ruchika <ruchika@example.com>';
    $pattern = '/<(.*?)>/i';

    preg_match_all($pattern, $string, $matches);
    var_dump($matches);
    $email = $matches[1][0] ?? $string;
    echo $email;
?>
Run Code Online (Sandbox Code Playgroud)

这是一个分叉的演示

当然,如果我的假设不正确,那么这种方法就会失败。但是根据您的输入,我相信您想提取 < 和 > 字符中包含的电子邮件。

  • 这是迄今为止最干净的解决方案 (3认同)

小智 5

试试这个代码。

<?php

function extract_emails_from($string){
  preg_match_all("/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i", $string, $matches);
  return $matches[0];
}

$text = "blah blah blah blah blah blah email2@address.com";

$emails = extract_emails_from($text);

print(implode("\n", $emails));

?>
Run Code Online (Sandbox Code Playgroud)

这将起作用。

谢谢。