【问题标题】:Parse name from full email address in PHP [duplicate]从 PHP 中的完整电子邮件地址解析名称 [重复]
【发布时间】:2017-09-02 06:02:42
【问题描述】:

我想从完整的电子邮件地址中获取名称并尝试了 htmlentities 和 html_entity_decode 但特殊字符 <> 给出了获取名称的问题。由于完整的电子邮件地址来自数组(键值)而不是字符串。

数组值:

Array
(
   [ENV_MAIL] => "Project Bribara<project.bribara@gmail.com";
)

尝试过的代码:

// Project email
$environment['ENV_MAIL'] = "Project Bribara<project.bribara@gmail.com";
$projectEmail = $environment['ENV_MAIL'];
echo $projectEmail ;
$projectName = explode("@", htmlentities($adminEmail));
echo html_entity_decode($projectName);

预期:

"Project Bribara"

实际:

"Project Bribara<project.bribara

我怎样才能得到预期的输出?

【问题讨论】:

  • 如果你有这个字符串Project Bribara&lt;project.bribara@gmail.com你为什么不能在&lt;上爆炸
  • 特殊字符
  • 你期待这样的eval.in/853973吗?
  • 是的,但问题是值来自数组(而不是字符串),所以这个爆炸不起作用。出于这个原因,我尝试了 htmlentities 和 html_entity_decode 但没有运气。您的代码非常适合字符串。
  • 你能分享print_r你的数组和预期输出吗?

标签: php html-entities html-encode


【解决方案1】:

你可以这样做。这里我们使用explode()函数来分割一个字符串。

Try this code snippet here

$environment['ENV_MAIL'] ="Project Bribara<project.bribara@gmail.com";
echo explode("<",$environment['ENV_MAIL'])[0];

【讨论】:

  • 您的解决方案很好并且被赞成,但是由于值中的 htmlentities(可能不可见)会导致问题爆炸或 substr 根本不起作用。
【解决方案2】:

您可以使用 Substr 和 strpos。
Substr 将字符串从第一个字符拆分到 strpos 找到 &lt; 的位置。

$str = "Project Bribara<project.bribara@gmail.com";
// Or ^^ is $projectEmail if I understand it correct?

Echo substr($str, 0, strpos($str , "<"));

https://3v4l.org/qSF4h

如果&lt; 引起问题,也许你可以试试正则表达式?

https://regex101.com/r/EfkwLX/1

// Match a-Z and space multiple until non word character
$re = '/([a-zA-Z ]+)\W/';
$str = 'Project Bribara<project.bribara@gmail.com';

preg_match($re, $str, $matches);

Echo $matches[1];  

https://3v4l.org/fuEL5

【讨论】:

  • @Alive 不知道是否如 OP 所说,&lt; 有问题,那么我的回答也会失败。还是?
  • 在这种情况下,每个人都失败了:):)。我认为 OP 多次使用 htmentities() 导致问题
  • 您的解决方案很好并且被赞成,但是由于值中的 htmlentities(可能不可见)会导致问题爆炸或 substr 根本不起作用。你能推荐一些使用正则表达式的东西吗?
  • 得到了使用 html_entity_decode 的答案。
  • @Jitesh 使用正则表达式更新。但请记住,正则表达式比正常的爆炸或字符串操作要慢。
【解决方案3】:

您应该首先使用“”将字符串拆分姓名电子邮件地址。如果你愿意,然后用“@拆分

【讨论】:

    【解决方案4】:

    有几种方法可以解决这个问题:(Demo Link)

    所有其他答案都失败的原因是您错误地表示了输入字符串。您的实际输入字符串包含&amp;lt;,它是&lt; 的html 实体。我下面的方法将向未来的 SO 读者阐明这一点,并帮助您为您的项目选择最佳方法。

    $environment['ENV_MAIL']="Project Bribara&lt;project.bribara@gmail.com";
    //                                       ^^^^ html entity causing you trouble
    
    $decoded_string=html_entity_decode($environment['ENV_MAIL']);  // convert "&lt;" to "<"
    var_export(explode('<',$decoded_string));  // generate an array of the two parts for future access
    
    echo "\n\n";
    
    echo "Project Name = ",strstr($decoded_string,'<',true);  // use strstr on < of decoded string with "true" param
    
    echo "\n\n";
    
    echo "Project Email = ",substr($decoded_string,strpos($decoded_string,'<')+1);  // use substr&strpos on <
    
    echo "\n\n";
    
    // or less potentially damaging to your input string...
    var_export(explode('&lt;',$environment['ENV_MAIL']));
    

    输出:

    array (
      0 => 'Project Bribara',
      1 => 'project.bribara@gmail.com',
    )
    
    Project Name = Project Bribara
    
    Project Email = project.bribara@gmail.com
    
    array (
      0 => 'Project Bribara',
      1 => 'project.bribara@gmail.com',
    )
    

    【讨论】:

      【解决方案5】:
      // Project email
      $environment['ENV_MAIL'] = "Project Bribara<project.bribara@gmail.com";
      $projectEmail = $environment['ENV_MAIL'];
      echo $projectEmail;
      $projectName = html_entity_decode ($projectEmail);
      echo $projectName;
      

      【讨论】:

        猜你喜欢
        • 2011-11-27
        • 2011-05-14
        • 1970-01-01
        • 2011-01-07
        • 2014-02-05
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多