2016-04-27 183 views
-2

我不知道是否有可能使用正則表達式-ES 我也有類似的文字來解決這類模板解析:PHP的正則表達式來代替空格括號包括大括號

'Hello, {{ Na me|{{Surname }}}}. Would you like some drink? {{CoffeePreferred? We have a special discount for coffee}} {{Tea Preferred? We have a special discount for tea}}' 

首先,我需要修復的錯誤變量名(變量必須總是在大括號後面加上「?」或「|」之類的特殊符號,或者其他名稱可以是逗號或點 - 這意味着將來可以添加規則)。

Na me,Tea PreferredSurname是變量名的拼寫錯誤。同樣,變量名應該在大括號之後不包含空格之後開始,否則它也是錯誤的。

然後我需要保持原樣。

親愛的朋友我們有咖啡一個特別的折扣我們的茶葉的特別折扣是簡單的文本。

所以我的問題是如何用變量中的下劃線替換不必要的空格並將它們保留在文本中?此外,我想盡可能減少步驟(由於性能影響,我的文本可能需要數兆字節)。

我希望我的文字是:

'Hello, {{Na_me|{{Surname}}}}. Would you like some drink? {{CoffeePreferred? We have a special discount for coffee}} {{Tea_Preferred? We have a special discount for tea}}' 

我的第一個步驟是提取括號的內容:

preg_replace_callback(
    '/(\{\{)(.*?)(\}\})/ui', 
    function ($matches) { 
     echo $matches[2]; 
}); 

然後我試圖通過上面沒有成功描述的規則來代替空格。我試圖使用斷言,如/[\s](?!<=\|)/和表達式(\s(?!\|))|((?!\|)\s)有沒有人有任何想法?

+0

你說'變量總是來了嗎? 「或「|」或別的什麼「你是什麼意思的」別的東西「? – Toto

+0

給定示例的結果是什麼? – Toto

+0

@Toto,'變量總是在大括號後面出現 - - 這是一個規則,但用戶可以打破它,在這種情況下,我需要修復它('trim'對於簡單模板工作正常,但是當大括號包括大括號時,它會成爲我的問題)'別的東西'意味着將來可以添加或更改規則,例如感嘆號可以有特殊的含義 - 因此必須保留所有空格,然後必須用下劃線替換。我在我的問題中添加了一個結果 – sly

回答

1

這裏有一個方法來完成這項工作:

$str = preg_replace_callback(
    '/\{\{([^|?{}]+)/', 
    function ($matches) { 
     $ret = trim($matches[1]); 
     return preg_replace('/ /', '_', $ret); 
    }, 
    $str 
); 

之後,你可以刪除所有的括號:牙套像「特殊符號之後

$str = preg_replace('/[{}]+/', '', $str); 
相關問題