簡體   English   中英

使捕獲組在正則表達式中為可選

[英]Making a capturing group optional in a regex

我有一個自動生成的電子郵件,試圖將其解析為字段以導入到應用程序中。 如果所有字段都存在,我可以使用正則表達式。 但是,情況並非總是如此。 具體來說,電話號碼有時會丟失。

$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.
}

我如何獲取它來提取一個存在的電話號碼,否則將一個NULL放入$import->phone呢?

請注意,“ State”位於正則表達式中,只是為了幫助使郵政編碼位置為零。

您可以給捕獲組起一個名字 (?P<name> ...)並使用?使其可選?

我准備了一個簡化的例子。 假設您有一個類似的字符串:

name [age (optional)] message:

您可以使用以下正則表達式進行解析:

// 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;

放一個? 直接在您的電話號碼捕獲組之后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM