php - PCRE:使用 PHP 捕获可选模式

标签 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}(即模式中最后的 ? 运算符)更加贪婪(具有讽刺意味的是,作为量词修饰符,它的作用恰恰相反)

最佳答案

在这里试试这个

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

查看here on Regexr

我将第二组设为非捕获组,因此您有两个捕获组,第一个包含强制部分,第二个包含可选部分。

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

关于php - PCRE:使用 PHP 捕获可选模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8894708/

相关文章:

regex - 如何正确匹配正则表达式?

javascript - 如何在 Javascript 中 ltrim 和 rtrim 选择字符?

php - 是否可以使用自定义模式分割文件内容?

php - preg_match 提取标识符和别名

具有 0 或 2 个小数位的正数的 PHP 正则表达式

php - 从 Mysql 检索日期并将其溢出到特定列表

php - 如何将以 HTML 形式输入的字符串保存到文本文件

php - 仅使用 preg_replace() 还是组合 preg_match() 和 preg_replace()?

php - 如何在 explode() 函数中使用条件?

PHP 电子邮件问题