preg_match_all 仅返回每隔一个匹配项

我有这样的程序:


$txt = "

{ABC}

+ 1

- 1


{DEF}

+ 2

- 2


{IJK}

+ 3

- 3


{LMN}

+ 4 

- 4

";

preg_match_all('/\{.*?\{/s', $txt, $matches);

var_dump($matches);

我想匹配两个左大括号(或文本结尾)之间的所有内容。但我的结果只包含 ABC 和 IJK 块,因为下一个 { 已经被吃掉了。


array(1) {

  [0]=>

  array(2) {

    [0]=>

    string(16) "{ABC}

+ 1

- 1


{"

    [1]=>

    string(16) "{IJK}

+ 3

- 3


{"

  }

}


慕虎7371278
浏览 39回答 2
2回答

小怪兽爱吃肉

使用正则表达式先行运算 (?=)符将允许您匹配 a 之前的任何内容,{而无需实际匹配{字符本身。preg_match_all('/\{.*?(?=\{)/s', $txt, $matches)会给你这个结果:array(1) {  [0]=>  array(3) {    [0]=>    string(15) "{ABC}+ 1- 1"    [1]=>    string(15) "{DEF}+ 2- 2"    [2]=>    string(15) "{IJK}+ 3- 3"  }}您提到您还想匹配 a{和文本末尾之间的内容。您可以通过在前瞻内使用管道运算符和字符串 锚点|末尾来实现此目的。 $preg_match_all('/\{.*?(?=\{|$)/s', $txt, $matches)会给你你想要的结果:array(1) {  [0]=>  array(4) {    [0]=>    string(15) "{ABC}+ 1- 1"    [1]=>    string(15) "{DEF}+ 2- 2"    [2]=>    string(15) "{IJK}+ 3- 3"    [3]=>    string(14) "{LMN}+ 4 - 4"  }}

呼如林

我建议使用否定字符类 [^,它将匹配除左括号之外的任何字符。这样,它将从开头匹配{到字符串的下一次出现{或结尾。{[^{]*正则表达式演示| PHP演示例如preg_match_all('/{[^{]*/', $txt, $matches);
打开App,查看更多内容
随时随地看视频慕课网APP