2011-05-05 32 views
8

我有類似這樣的字符串:如何獲得最短,而不是最長的正則表達式匹配的preg_match()

{{something1}} something2 {{something3}} something4 

我怎麼能只匹配「something1」使用preg_match()功能?

我想:

preg_match("/\{\{(.*)\}\}/si",$content,$matches); 

但這匹配的太多,返回

something1}} something2 {{something3 

我嘗試添加\b的模式,但沒有得到什麼,我想無論是那種方式。

你能幫我解決嗎?

+0

那看起來像某種不正當的json,你是否能夠在絃樂到達之前控制絃樂? – mcgrailm 2011-05-05 12:19:42

+2

第一個問題。正確地問。 Upvoted。 – 2011-05-05 15:31:22

回答

19

使用非貪婪修改?

preg_match("/\{\{(.*?)\}\}/si",$content,$matches); 
      here --^ 
+1

謝謝作品! 「這裏 - ^」是megacool) – Narek 2011-05-05 12:23:36

0

試試這個:

preg_match('|{{([^}]+)}}|si', $content, $matches); 

echo $matches[1]; 
+1

由於OP的關閉「標記」是一個雙'}',所以可以允許單個'}'。不願意的'。*?'更適合M42的建議,國際海事組織。 – 2011-05-05 12:21:27

+0

謝謝,但不起作用:) – Narek 2011-05-05 12:24:55

+0

這兩種方法也同樣適用。我更喜歡使用'[^'儘可能具體。我相信使用。*?需要比上述正則表達式更多的步驟(儘管我不確定,稍後會進行測試),但性能差異可以忽略不計。 – 2011-05-05 12:27:18

1

一個完整的答案 - 如果我們是$ var是:

STARTT 
FIRST KKK 
SECOND KKK 

1)的情況下,我們使用:

$var = preg_replace('/STARTT(.*)KKK/', 'REPLACED-STRING', $var); 

它將一切從STARTT改變去年KKK和結果將是:

REPLACED-STRING 

2)如果我們使用:

$var = preg_replace('/STARTT(.*?)KKK/', 'REPLACED-STRING', $var); 

結果將是:

REPLACED-STRING 
SECOND KKK 
相關問題