我需要解析遵循以下格式的电子邮件:
嗨John Doe,
这里有更多文字。
甚至更多,更多,更多的文字 您的用户名是:1234
您的激活ID是:5678910
更多文字来到这里。
我正在寻找的正则表达式必须返回:
我尝试了以下正则表达式,但它返回了整个电子邮件;我相信我犯的错误是电子邮件正文的其余部分还有其他逗号,所以冒号匹配所有这些。如果用户输入了一个包含逗号的奇怪用户名,那么即使是称呼中的名称也可以包含逗号。
preg_match_all("/Hi (.*),/", $out, $match);
答案 0 :(得分:2)
使用正则表达式
/Hi (.*?),\n.*?user ID is: (\d+).*?activation ID is: (\d+)/s
↑ ↑ ↑
"John Doe" "1234" "5678910"
$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
}
}