-1

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

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

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

  1. 称呼中的名字(这里:“John Doe”)
  2. 用户 ID(此处:1234)
  3. 激活 ID(此处:5678910)

我尝试了以下正则表达式,但它返回了整个电子邮件;我相信我犯的错误是电子邮件正文的其余部分中还有其他逗号,因此冒号与所有逗号匹配。如果用户输入了一个奇怪的包含逗号的用户名,那么即使是称呼中的名字也可以包含逗号。

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

2 回答 2

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

检查这个演示

于 2012-10-16T18:02:08.473 回答
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

但是,您可以将它们全部放入一个正则表达式中(如果您使用命名的子模式,它将更好地阅读:

$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
    }
}
于 2012-10-16T18:01:53.153 回答