亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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個贊

我建議使用否定字符類?[^,它將匹配除左括號之外的任何字符。

這樣,它將從開頭匹配{到字符串的下一次出現{或結尾。

{[^{]*

正則表達式演示|?


查看完整回答
反對 回復 2024-01-19
  • 2 回答
  • 0 關注
  • 182 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號