2016-05-15 24 views
0

好的,所以我一直試圖弄清楚這一點,在PHP中使用各種正則表達式。我有這樣的一個字符串:PHP正則表達式:匹配非轉義字符組

$str = "this is a(n) {item} made by {username}. Watch out for \\{escaped} items. This one is \\\\{notescaped}."; 

我需要捕獲由花括號包圍的非轉義組。我打算在組中使用preg_split將組中的字符串拆分成一個數組,以便稍後用所需的信息填充空格。

所以這樣的結果應該是:

// After preg_split 
array (
    [0] => "this is a(n) ", 
    [1] => " made by ", 
    [2] => ". Watch out for {escaped} items. This one is \\", 
    [3] => "." 
); 

// Captured delimiters from preg_split 
array(
    [0] => "{item}", 
    [1] => "{username}", 
    [2] => "{notescaped}", 
); 

我知道如何簡單地使用基本\{.*\}捕獲組,但我需要確保它沒有逃脫。所以像\\\\\\{escaped}(3反斜槓)仍然會逃脫它。此外,大括號內的字符可以是任何字符,沒有特定的內容,也沒有任何需要檢查轉義的字符。任何幫助,這是非常感謝!

回答

1

反斜槓,一起工作很煩,但這會發現一切與「轉義」括號:

(?<=^|[^\\])(?:[\\]{4})*[{]([^}]*)[}] 

作爲一個字符串,它成爲這個怪物:

$re = "~(?<=^|[^\\\\])(?:[\\\\]{4})*[{]([^}]*)[}]~s"; 

從本質上講,它確保在括號之前有一個偶數的反斜槓。

+0

這幾乎就是它!我只有幾個問題,如果文本中的第一個項目是一個組,如''{this}將不匹配「,並且文本之間存在空格和開放的大括號,該空間被截斷。 ''一些{item}「=> [」一些「,」項目「]'。 –

+0

@DavidLudwig固定。它現在使用積極的外觀作爲非反斜線或字符串的開始。 – Laurel

+0

就是這樣,非常感謝你! –