嵌套結構是根據定義對於正則表達式來說太複雜了(是的,PCRE支持遞歸,但這對替換問題沒有幫助)。有兩種可能的選擇(無論如何使用正則表達式)。首先,您可以簡單地通過打開標籤來替換開頭的括號,而對於結束標籤來說也是如此。然而,這將轉化無與倫比的括號,以及:
$str = preg_replace('/\{/', '<tag>', $str);
$str = preg_replace('/\}/', '</tag>', $str);
另一種選擇是隻替換匹配{
和}
,但你必須要反覆做,因爲一個呼叫preg_replace
不能代替多個嵌套層次:
do
{
$str = preg_replace('/\{([^{]*?)\}/', '<tag>$1</tag>', $str, -1, $count);
}
while ($count > 0)
編輯:雖然PCRE支持遞歸與(?R)
這很可能不會有替代的幫助。原因在於,如果捕獲組被重複,則其引用將僅包含最後一次捕獲(即,當在aaaab
中匹配/(a|b)+/
時,$1
將包含b
)。我想這和遞歸是一樣的。這就是爲什麼你只能替換最內層的匹配,因爲它是遞歸中捕獲組的最後一個匹配。同樣,你不能嘗試用遞歸捕獲{
和}
並替換它們,因爲它們可能會被匹配任意次數,並且只有最後一次匹配會被替換。
只匹配正確的嵌套語法,然後替換最裏面或最外面的匹配括號也不會幫助(有一個preg_replace
調用),因爲多個匹配不會重疊(所以如果找到3個嵌套括號,則內部2個括號他們自己將被忽略進一步的比賽)。
已經想過了。這很簡單,但如果找不到匹配的括號,可能會導致打破標記。 – tijagi
您可以重複調用搜索/替換。 (答案已更新) –