Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从string-php提取电子邮件地址_Php - Fatal编程技术网

从string-php提取电子邮件地址

从string-php提取电子邮件地址,php,Php,我想从字符串中提取电子邮件地址,例如: <?php // code $string = 'Ruchika <ruchika@example.com>'; ?> 从上面的字符串中,我只想获得电子邮件地址ruchika@example.com 请推荐如何实现这一点。试试这个 <?php $string = 'Ruchika < ruchika@example.com >'; $pattern = '/[a-z0-9_\-\+\.]+@

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

<?php // code
$string = 'Ruchika <ruchika@example.com>';
?>

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

请推荐如何实现这一点。

试试这个

<?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]);
?>

第二种方法

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

请参见尝试此代码

<?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));

?>

这会奏效的

谢谢

您也可以尝试:

email=re.findall(r'\S+@\S+','ruchika@example.com')
print email

其中,
\S
表示任何非空白字符

这基于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;
?>

这是


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

解析电子邮件地址是一项疯狂的工作,将导致非常复杂的正则表达式。例如,考虑这个官方正则表达式来捕获电子邮件地址:

太棒了,对吧

相反,有一个标准的php函数来执行此操作,称为
mailparse\u rfc822\u parse\u addresses()
,并有文档记录

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

所以

发现了一些有用的东西,比如贝娄

<?php
    // input: My Test Email <some.test.email@somewhere.net>

    function get_displayname_from_rfc_email($rfc_email_string) {
        // match all words and whitespace, will be terminated by '<'
        $name = preg_match('/[\w\s]+/', $rfc_email_string, $matches);
        $matches[0] = trim($matches[0]);
        return $matches[0];
    }
    // Output: My Test Email

    function get_email_from_rfc_email($rfc_email_string) {
        // extract parts between the two parentheses
        $mailAddress = preg_match('/(?:<)(.+)(?:>)$/', $rfc_email_string, $matches);
        return $matches[1];
    }
    // Output: some.test.email@somewhere.net
?>

希望这能对其他人有所帮助。

使用(我的)函数从给定字符串中轻松提取电子邮件地址

<?php

function getEmailArrayFromString($sString = '')
{
    $sPattern = '/[\._\p{L}\p{M}\p{N}-]+@[\._\p{L}\p{M}\p{N}-]+/u';
    preg_match_all($sPattern, $sString, $aMatch);
    $aMatch = array_keys(array_flip(current($aMatch)));

    return $aMatch;
}

// Example
$sString = 'foo@example.com XXX bar@example.com XXX <baz@example.com>';

$aEmail = getEmailArrayFromString($sString);

/**
* array(3) {
    [0]=>
        string(15) "foo@example.com"
    [1]=>
        string(15) "bar@example.com"
    [2]=>
        string(15) "baz@example.com"
    }
*/
var_dump($aEmail);

这甚至可以在子域上使用。它从文本中提取所有电子邮件

$marches[0]
包含所有电子邮件

$pattern = "/[a-zA-Z0-9-_]{1,}@[a-zA-Z0-9-_]{1,}(.[a-zA-Z]{1,}){1,}/";
preg_match_all ($pattern , $string, $matches);
print_r($matches);
Array
(
    [0] => Array
        (
            [0] => clotdesormakilgehr@prednisonecy.com
            [1] => **********@******.co.za.com
            [2] => clotdesormakilgehr@prednisonecy.com
            [3] => clotdesormakilgehr@prednisonecy.mikedomain.com
            [4] => clotdesormakilgehr@prednisonecy.com
        )

    [1] => Array
        (
            [0] => .com
            [1] => .com
            [2] => .com
            [3] => .com
            [4] => .com
        )

)
$marches[0]
包含所有电子邮件

$pattern = "/[a-zA-Z0-9-_]{1,}@[a-zA-Z0-9-_]{1,}(.[a-zA-Z]{1,}){1,}/";
preg_match_all ($pattern , $string, $matches);
print_r($matches);
Array
(
    [0] => Array
        (
            [0] => clotdesormakilgehr@prednisonecy.com
            [1] => **********@******.co.za.com
            [2] => clotdesormakilgehr@prednisonecy.com
            [3] => clotdesormakilgehr@prednisonecy.mikedomain.com
            [4] => clotdesormakilgehr@prednisonecy.com
        )

    [1] => Array
        (
            [0] => .com
            [1] => .com
            [2] => .com
            [3] => .com
            [4] => .com
        )

)

一种相对直接的方法是使用PHP内置方法将文本拆分为单词并验证电子邮件:

function fetchEmails($text) {
    $words = str_word_count($text, 1, '.@-_1234567890');
    return array_filter($words, function($word) {return filter_var($word, FILTER_VALIDATE_EMAIL);});
}

将返回文本变量中的电子邮件地址。

基于Priya Rajaram的代码,我对该函数进行了进一步优化,使每个电子邮件地址只显示一次

例如,如果一个HTML文档被解析,您通常会得到所有内容两次,因为邮件地址也会在mailto链接中使用

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

这非常有效,而且非常简单:


$email=strpos($from,'您应该使用phps preg*函数来实现这一点。构建一个匹配每个邮件地址的正则表达式不是一件容易的任务,有关详细信息,请参阅本讨论:在这里,您可以找到一篇有用的文章,从java中的字符串获取所有电子邮件地址,您可以将其修改为用于PHP。为什么不使用
filter\u var\u数组($string,FILTER\u VALIDATE\u EMAIL)
建议?仅供参考-仅适用于基本域名,如gmail.com。它将适用于邮件子域名的电子邮件地址,如email@mg.website.comThe第一版(/[a-z0-9\-\+\.]+@[a-z0-9\-]+\.([a-z]{2,4})(?:\.[a-z]{2})?/i)从“foo”中省略了“foo”。bar@example.com"!我认为这个正则表达式更适合查找电子邮件。“[A-Z0-9a-z.\%+-]+@[A-Za-Z0-9.-]+\.[A-Za-z]{2,6}”这里的细节对研究人员来说并没有什么教育意义。另外,在第二种模式中,如果您只使用第一个捕获组,则没有理由使用lookarounds。在第一种模式中,您匹配尾随空间,然后手动修剪尾随空间——这意味着您的模式没有经过优化。这是一种从中获取电子邮件地址的好方法一个电子邮件地址列表,但它在随机自由文本中的电子邮件地址上效果不太好…@ftrotter是的,它不打算这样做,这也不是OP要求的。它旨在从一个类似于邮件信封中的列表中提取电子邮件地址。这是迄今为止最干净的解决方案“i”修饰符是amb我在正则表达式中使用,因为给定的模式中没有字母字符。它不是PHP,所以它不是这个问题的答案。抱歉,但如果电子邮件地址中有句点,那么它将失败。例如:bob。smith@example.com.它只返回“smith@example.com"谢谢。这可以正确处理带句点的电子邮件地址。例如:bob。smith@example.co.whatever.com.列出的其他一些解决方案不起作用。当电子邮件包含非字母字符(如数字)时不起作用。如果它不包含数字,我更正了此问题。您可以按地址添加电子邮件中允许的缺失字符,但这将匹配大多数现实世界的电子邮件地址。您运行
strpos($from',这取决于字符串长度,对于较小的字符串,不应该有任何可见的CPU浪费时间,这也是因为另一种解决方案是将结果存储在变量中,这也需要CPU时间。