php – 如何使用preg_match_all()获取子组匹配的所有捕获?
参见英文答案 >
Get repeated matches with preg_match_all()????????????????????????????????????6个
更新/注意事项:
参考文献:PCRE regular expressions using named pattern subroutines. (仔细读:) 我有一个包含可变数量的段(简化)的字符串: $subject = 'AA BB DD '; // could be 'AA BB DD CC EE ' as well 我想现在匹配段并通过匹配数组返回它们: $pattern = '/^(([a-z]+) )+$/i'; $result = preg_match_all($pattern,$subject,$matches); 这将仅返回捕获组2的最后一个匹配:DD. 有没有办法可以通过一次正则表达式执行检索所有子模式捕获(AA,BB,DD)? preg_match_all不适合这个吗? 这个问题是一个概括. $subject和$模式都被简化了.当然,使用这样的AA,…的一般列表更容易用其他函数(例如,爆炸)或使用$pattern的变体来提取. 但我特别询问如何使用preg _…-系列函数返回所有子组匹配. 对于现实生活中的情况,假设您有多个(嵌套)级别的子模式匹配变量. 例 这是用于描述一些背景的伪代码的示例.想象一下: 令牌的常规定义: CHARS := [a-z]+ PUNCT := [.,!?] WS := [ ] $subject得到基于这些的标记.标记化存储在标记数组(type,offset,…)中. 然后将该数组转换为字符串,每个标记包含一个字符: CHARS -> "c" PUNCT -> "p" WS -> "s" 因此,现在可以在令牌流字符串索引上运行基于令牌(而不是字符类等)的正则表达式.例如. regex: (cs)?cp 表达一组或多组字符,后跟标点符号. 我现在可以将自定义标记表达为正则表达式,下一步是构建语法.这只是一个例子,这是一种ABNF风格: words = word | (word space)+ word word = CHARS+ space = WS punctuation = PUNCT 如果我现在将单词的语法编译成(标记)正则表达式,我希望自然地拥有每个单词的所有子组匹配. words = (CHARS+) | ( (CHARS+) WS )+ (CHARS+) # words resolved to tokens words = (c+)|((c+)s)+c+ # words resolved to regex 我可以编码直到这一点.然后我遇到了子组匹配的问题只包含他们的最后一场比赛. 所以我可以选择自己创建一个语法自动机(我想阻止语法表达式保持通用)或者某种程度上让preg_match为我工作,所以我可以省去它. 这基本上都是.可能现在可以理解为什么我简化了这个问题. 有关: > pcrepattern man page 解决方法
试试这个:
preg_match_all("'[^ ]+'i",$text,$n); $n [0]将包含文本中所有非空格字符组的数组. 编辑:包含子组: preg_match_all("'([^ ]+)'i",$n); 现在$n [1]将包含子组匹配,与$n [0]完全相同.实际上这毫无意义. Edit2:嵌套子组示例: $test = "Hello I'm Joe! Hi I'm Jane!"; preg_match_all("/(H(ello|i)) I'm (.*?)!/i",$test,$n); 结果如下: Array ( [0] => Array ( [0] => Hello I'm Joe! [1] => Hi I'm Jane! ) [1] => Array ( [0] => Hello [1] => Hi ) [2] => Array ( [0] => ello [1] => i ) [3] => Array ( [0] => Joe [1] => Jane ) ) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |