我有这样的程序:$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"
}
}
- 2 回答
- 0 关注
- 101 浏览
添加回答
举报
0/150
提交
取消