首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在正则表达式中使捕获组可选

在正则表达式中使捕获组可选
EN

Stack Overflow用户
提问于 2014-10-26 19:50:28
回答 2查看 173关注 0票数 0

我有一封自动生成的电子邮件,我正试图将其解析为要导入到应用程序中的字段。如果所有的字段都存在,我有一个工作准则。然而,情况并不总是如此。具体来说,电话号码有时会丢失。

代码语言:javascript
运行
复制
$regex = '/Bill\sTo:\s+([A-Za-z]+\s[A-Za-z]+)\s.+[A-Z]{2}\s(\d{5})\s.*\s((?:\([2-9]\d{2}\)\ ?|[2-9]\d{2}(?:\-?|\ ?))[2-9]\d{2}[- ]?\d{4})\s+([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})\s+Ship\sTo:/s';
//                     ^       Name         ^    ^State ^  ^ Zip ^      ^                       Phone Number                            ^   ^                      Email                    ^

if (preg_match($regex, $content, $matches)) {
    $import = new ImportedEmail;

    $import->name = $matches[1];
    $import->zip = $matches[2];
    $import->phone = $matches[3];
    $import->email = $matches[4];

    // ...more processing code follows.
}

当一个电话号码存在时,我如何才能让它提取出来,但如果不是这样,我就可以将一个空值放到$import->phone中了。

请注意,"State“在regex中只是为了帮助零进入邮政编码的位置。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-26 20:39:16

您可以给捕获组一个名字 (?P<name> ...),并使用?使其可选。

我准备了一个简化的例子。假设你有一个字符串,如:

代码语言:javascript
运行
复制
name [age (optional)] message:

您可以使用以下regex解析它:

代码语言:javascript
运行
复制
// Jon is 37 years old 
$str1 = 'jon 37 hello world';
// Jane does not tell about her age ;)
$str2 = 'jane foo bar';

preg_match('/(?P<name>[a-z]+ )?(?P<age>[0-9]+ )?(?P<message>.*)/', $str1, $m);    
echo $m['name'] . PHP_EOL;
echo $m['age'] . PHP_EOL;
echo $m['message'] . PHP_EOL;


preg_match('/(?P<name>[a-z]+ )?(?P<age>[0-9]+ )?(?P<message>.*)/', $str2, $m);    
echo $m['name'] . PHP_EOL;
echo $m['age'] . PHP_EOL; // index exists but is now empty
echo $m['message'] . PHP_EOL;
票数 1
EN

Stack Overflow用户

发布于 2014-10-26 20:40:38

放个?直接在你的电话号码捕捉组之后。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26577204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档