PCRE:使用PHP捕获可选模式

时间:2012-01-17 12:36:32

标签: php regex preg-match pcre

我有一个字符串,我需要从中捕获一个,可能还有两个子字符串(使用PHP):

  • 第一个是强制性的
  • 第二个是可选的
  • 第一个和第二个被未知的垃圾分开
  • 第二个可能会或可能不会有更多垃圾我不关心

我无法让我的模式捕获第二个模式,除非我在模式字符串中强制它。如果主体中只有第一个模式可用,则会导致模式失败。

我很难过。这不应该那么难。

<?php

// sometimes the subject looks like this:
//$subject = 'pattern 111 -then some random junk-';
$subject = 'pattern 111 -then some random junk- pattern 222';

preg_match('/(pattern 111)(.*?)(pattern 222)?/', $subject, $matches);

print_r($matches);

?>

这是我从上面得到的:

Array
(
    [0] => pattern 111
    [1] => pattern 111
    [2] => 
)

似乎归结为如何使{0,1}(即模式中的最终?运算符)更加贪婪(具有讽刺意味的是,作为量词修饰符,它会做相反的事情)

1 个答案:

答案 0 :(得分:4)

在这里试试

(pattern 111)(?:.*(pattern 222))?

here on Regexr

我使第二组成为非捕获组,因此你有两个捕获组,第一组包含必需部分,第二组包含可选部分。

最后将惰性量词与可选部分组合起来是行不通的,但如果缺少可选部分,则无需匹配强制模式后的部分,因此只需将未知垃圾包含在可选部分中一部分。