我有一个字符串,我需要从中捕获一个或两个子字符串(使用 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}(即模式中最后的 ? 运算符)更加贪婪(具有讽刺意味的是,作为量词修饰符,它的作用恰恰相反)
最佳答案
在这里试试这个
(pattern 111)(?:.*(pattern 222))?
我将第二组设为非捕获组,因此您有两个捕获组,第一个包含强制部分,第二个包含可选部分。
将惰性量词与最后的可选部分组合起来是行不通的,但是如果可选部分缺失,则无需按照您的强制模式匹配部分,因此只需将未知的垃圾包含到可选中即可部分。
关于php - PCRE:使用 PHP 捕获可选模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8894708/