Php Regex重复组忽略字符串
我做了一些调查,但对我的案子毫无用处 我有一个正则表达式,在这里我可以得到Stream#0:4,但我想重复这个规则,也可以得到Stream#0:5。我如何重复规则,忽略中间代码< > > 0:0(复制)-> 0:1(复制)< /代码> 正则表达式 我目前的成绩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
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]);
}