在PHP

时间:2018-01-12 13:03:45

标签: php regex pcre

我有这种格式的电子邮件地址:

Jane Doe <jane.doe@example.com>

我想将Jane Doe设置为一个变量,将jane.doe@example.com设置为另一个变量。

这是一个正则表达式的情况,还是有更优雅的方式?

我能得到的最接近的是表达式/\<(.*?)\>,它返回<jane.doe@example.com>(带尖括号)。

3 个答案:

答案 0 :(得分:1)

您可以使用您的模式(或一点修改版本)来preg_split字符串,并获得一个包含2个值的数组:

$s = 'Jane Doe <jane.doe@example.com>';
$res = preg_split('/\s*<([^>]*)>/', $s, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
print_r($res); // => Array ( [0] => Jane Doe [1] => jane.doe@example.com )

请参阅PHP demo

\s*<([^>]*)>模式找到0+空格(\s*)后跟<,然后将除>以外的任何0 +字符捕获到第1组({{1}然后匹配[^>]*>标志使PREG_SPLIT_DELIM_CAPTURE保持结果数组中的子匹配(组1值)。 preg_split标志将丢弃可能在开头或结尾出现的任何空项。 PREG_SPLIT_NO_EMPTY 限制参数将返回所有拆分块(无限制)。

还有一个匹配的解决方案,我建议使用命名的捕获组

-1

请参阅this PHP demoregex demo

模式详情

  • $s = 'Jane Doe <jane.doe@example.com>'; if(preg_match('/^(?<name>.*\S)\s*<(?<email>.*)>$/', $s, $m)) { echo $m["name"] . "\n"; echo $m["email"]; } - 字符串开头
  • ^ - Group&#34; name&#34 ;:任意0个字符,直到最后一个非空白字符后跟...
  • (?<name>.*\S) - 0+空白字符
  • \s* - <字符
  • < - 小组&#34;电子邮件&#34;:任意0+字符,尽可能多的
  • (?<email>.*) - >$位于字符串的末尾。

答案 1 :(得分:0)

使用preg_splitlist函数:

$input = 'Jane Doe <jane.doe@example.com>';

list($name, $email) = preg_split('/\s(?=<)/', $input);
$email = trim($email, '<>');
var_dump($name, $email);

输出:

string(8) "Jane Doe"
string(20) "jane.doe@example.com"

答案 2 :(得分:0)

使用捕获组,您可以匹配以下正则表达式。

正则表达式: ([^<]*)<([^>]*)>

说明:

  • ([^<]*)将捕获第一组中的名称。

  • ([^>]*)将捕获第二组中的电子邮件ID。

<强> Regex101 Demo

Php代码:

<?php
   $line = "Jane Doe <jane.doe@example.com>";


   if (preg_match("/([^<]*)<([^>]*)>/", $line, $match)) :
      $name=$match[1];
      $email=$match[2];
      print "Name: ". $match[1];
      print "\nEmail Id: ". $match[2];
   endif;
?>

<强>输出

  

姓名:Jane Doe

     

电子邮件ID:jane.doe@example.com

<强> Ideone Demo