为了账号安全,请及时绑定邮箱和手机立即绑定

preg_match_all 仅返回每隔一个匹配项

preg_match_all 仅返回每隔一个匹配项

PHP
慕虎7371278 2024-01-19 10:03:50
我有这样的程序:$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{"  }}
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

使用正则表达式先行运算 (?=)符将允许您匹配 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"

  }

}


查看完整回答
反对 回复 2024-01-19
?
呼如林

TA贡献1798条经验 获得超3个赞

我建议使用否定字符类 [^,它将匹配除左括号之外的任何字符。

这样,它将从开头匹配{到字符串的下一次出现{或结尾。

{[^{]*

正则表达式演示PHP演示

例如

preg_match_all('/{[^{]*/', $txt, $matches);


查看完整回答
反对 回复 2024-01-19
  • 2 回答
  • 0 关注
  • 101 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信