Php Regex重复组忽略字符串

Php Regex重复组忽略字符串,php,regex,preg-match,Php,Regex,Preg Match,我做了一些调查,但对我的案子毫无用处 我有一个正则表达式,在这里我可以得到Stream#0:4,但我想重复这个规则,也可以得到Stream#0:5。我如何重复规则,忽略中间代码< > > 0:0(复制)-> 0:1(复制)< /代码> 正则表达式 我目前的成绩 array(1) { [0]=> array(5) { [0]=> string(15) " Stream #0:4" [1]=> string(4) " " [2]=> str

我做了一些调查,但对我的案子毫无用处

我有一个正则表达式,在这里我可以得到Stream#0:4,但我想重复这个规则,也可以得到Stream#0:5。我如何重复规则,忽略中间代码< > > 0:0(复制)-> 0:1(复制)< /代码>

正则表达式

我目前的成绩

    array(1) { 
[0]=> array(5) 
  { 
  [0]=> string(15) " Stream #0:4" 
  [1]=> string(4) " " 
  [2]=> string(1) "m" 
  [3]=> string(1) " " 
  [4]=> string(3) "0:4" } 
  }
另一个问题是,我的正则表达式将“m”视为一个单独的组合,并包含空格。我该如何解决这个问题

我想要一个像这样的最终结果

[0]Stream #0:4
[1]Stream #0:5
为什么不简单

/^  Stream #([\d:]+) -> #([\d:]+) \((.*)\)/gm
这将匹配两次

  • ['0:4','0:0','copy']
  • ['0:5','0:1','copy']

  • 查看
    (?您可以使用基于
    \G
    运算符的自定义单词边界:

    $re = '/(?:\G(?!^)\s*|Stream mapping:\s*)\K([a-zA-Z]+\s+#[0-9]+:[0-9]+).*/';
    $str = 'Metadata:
          variant_bitrate : 800000
    Stream mapping:
      Stream #0:4 -> #0:0 (copy)
      Stream #0:5 -> #0:1 (copy)
    Press [q] to stop, [?] for help';
    
    if (preg_match_all($re, $str, $m)) {
     print_r($m[1]);
    }
    

    图案详情:

    • (?:\G(?!^)\s*|流映射:\s*)
      -上一个匹配的结尾和0+空格字符或
      流映射:
      子字符串后跟0+空格
    • \K
      -匹配重置运算符丢弃当前匹配的文本
    • ([a-zA-Z]+\s+#[0-9]+:[0-9]+)
      -第1组:1+字母,1+空格,
      ,1+数字,
      ,1+数字
    • *
      -行末尾的任何0+字符(必须使用,因为我们需要连续匹配)

    请参阅。

    文本中有多个流。我缩短了相关代码。我需要获得他们在“流映射:”后看到的两个流,如代码所示。在“流映射”处拆分文本并循环运行上述内容。我不认为使用更复杂的正则表达式会改善情况的任何原因。此外,为了将来,请在问题中包含您的要求。如果您有多个流,请让您的问题和示例这样说。我不太确定,您是否需要或?检查,尽管我无法标记问题的正确答案。这就是我需要的。谢谢你@WiktorStribiżew
    /^  Stream #([\d:]+) -> #([\d:]+) \((.*)\)/gm
    
    $re = '/(?:\G(?!^)\s*|Stream mapping:\s*)\K([a-zA-Z]+\s+#[0-9]+:[0-9]+).*/';
    $str = 'Metadata:
          variant_bitrate : 800000
    Stream mapping:
      Stream #0:4 -> #0:0 (copy)
      Stream #0:5 -> #0:1 (copy)
    Press [q] to stop, [?] for help';
    
    if (preg_match_all($re, $str, $m)) {
     print_r($m[1]);
    }