正则表达式在电子邮件致敬中找到名字

时间:2012-10-16 17:47:31

标签: php regex parsing email

我需要解析遵循以下格式的电子邮件:

  

嗨John Doe,
  这里有更多文字。
  甚至更多,更多,更多的文字   您的用户名是:1234
  您的激活ID是:5678910
  更多文字来到这里。

我正在寻找的正则表达式必须返回:

  1. 称呼中的名字(此处:“John Doe”)
  2. 用户ID(此处:1234)
  3. 激活ID(此处:5678910)
  4. 我尝试了以下正则表达式,但它返回了整个电子邮件;我相信我犯的错误是电子邮件正文的其余部分还有其他逗号,所以冒号匹配所有这些。如果用户输入了一个包含逗号的奇怪用户名,那么即使是称呼中的名称也可以包含逗号。

    preg_match_all("/Hi (.*),/", $out, $match);
    

2 个答案:

答案 0 :(得分:2)

使用正则表达式

/Hi (.*?),\n.*?user ID is: (\d+).*?activation ID is: (\d+)/s
      ↑                      ↑                         ↑
  "John Doe"              "1234"                   "5678910"

PHP代码:

$pattern = '/Hi (.*?),\n.*?user ID is: (\d+).*?activation ID is: (\d+)/s';
preg_match($pattern, $email, $m);
print("$m[1]\n$m[2]\n$m[3]");

输出:

John Doe
1234
5678910

检查this demo

答案 1 :(得分:1)

我会为每个字段使用一个正则表达式:

$match = array();
$regexs = array(
    '~Hi\s+(.+?),~', // notice ? -> "greedy killer"
    '~Your user ID is: (\d+)~',
    '~Your activation ID is: (\d+)~')

if( !preg_match( $regexs[0], $text, $match)){
    throw new Exception('Invalid mail format, cannot find user name');
}

// .. and so on for each field

但是你可以把它全部放在一个正则表达式中(如果你使用named subpattern它会更好阅读:

$regexp = '~Hi\s+(?P<name>.+?)|Your user ID is: (?P<id>\d+)|Your activation ID is: (?P<activation_id>\d+)~';
$matches = array();
preg_match_all( $regexp, $text, $matches, PREG_SET_ORDER);
foreach( $matches as $match){
    print_r( $match);
    if( !empty( $match['name'])){
       // Having a name
    }
}