2013-05-01 62 views
0

模板引擎同時處理{{foo}}{{{bar}}},它們對應於不同的處理。創建互斥,不重疊的正則表達式

目前,源處理preg_replace就像這樣:{{\s*(.+?)\s*}}{{{\s*(.+?)\s*}}}

問題是,這些正則表達式重疊,例如, {{\s*(.+?)\s*}}匹配{{{bar}}}


重要提示:標記{{{{{}}}}}是用戶可配置的實際代碼。所以通常的解決方案如[^{}]不能使用。


目前的解決方案是「前{{ }} S」 s到取代{{{ }}},但是這並不足夠強大的。的確,標記是用戶可配置的,用戶可以很容易地將標記設置爲破壞應用的值。

我試圖讓robuster正則表達式是互斥的,而不是順序依賴。我已經嘗試過使用斷言,條件等,但沒有成功。任何幫助將不勝感激。

順便說一句,使用正則表達式不是強制性的,只要代碼不會變得過長。

+0

剛剛被授權增加「laravel」中的可見性,如果你想要模板引擎標籤,也許將其換成刀片式。 – 2013-05-01 08:28:07

回答

0

聽起來像你需要嘗試一些lookarounds。這裏是我的樣品,其顯示了兩種不同的比賽考驗

$Matches = @() 
$String = 'A template{{{bar}}} engine processes both {{foo}} and {{{bar}}}, they correspond to different treatments.' 
write-host "Foo matches" 
([regex]'(?<!{){{([^{}]*)}}(?!})').matches($String) | foreach { 
    write-host "at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'" 
    } # next match 

Write-Host 
write-host "Bar matches" 
$Matches = @() 
([regex]'{{{([^{}]*)}}}').matches($String) | foreach { 
    write-host "at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'" 
    } # next match 

產生

Foo matches 
at 44 = 'foo' 

Bar matches 
at 13 = 'bar' 
at 57 = 'bar' 

我已經修改了內部文本測試,以尋找任何非「}或‘{’字符,這樣所有的字符

+0

對不起,我的意思是補充說這是用powershell編寫的 – 2013-05-01 04:14:54

+0

我編輯了我的帖子強調這一點:標誌ers'{{'','{{'','}},'}}}'是真實代碼中用戶可配置的。所以通常的解決方案如'[^ {}]'不能使用。儘管感謝您的幫助。 – 2013-05-01 04:35:02

+0

如果標記在實際代碼中是用戶可配置的,那麼您已經知道這些值是什麼,並且可以將它們替換爲正則表達式。 – 2013-05-01 04:47:49