[英]Is there a (recursive) PCRE regexp in PHP to denest tags
我有一個初始字符串,其中的標簽之間包含其他文本,並且該字符串可以包含嵌套標簽。 我希望根據以下規則“刪除”字符串:1)最終字符串與初始字符串沒有區別,只是添加或刪除了一些標簽。 2)在最后一個字符串中,每段文本都由將其括在原始字符串中的最接近的一對標記包圍。 如果有幾個相等的近對,則結果未指定(但為3),則沒有文本在最終字符串中歸屬新的標記)。
從而,
[a]text1[/a]text2[b]text3[c]text4[/c]text5[/b]
[e]text6[f]text7[/e]text8[/f]
應該成為
[a]text1[/a]text2[b]text3[/b][c]text4[/c][b]text5[/b]
[e]text6[/e]...[f]text8[/f]
其中…
可以是text7
, [e]text7[/e]
或[f]text7[/f]
。
是否有這樣做的正則表達式(例如,PHP中的遞歸PCRE正則表達式)?
方法
執行3次替換:
搜索結束標記,然后搜索另一個結束標記==>為第二個插入開始標記。 例:
[/b]text[/c] ==> [/b][c]text[/c]
搜索一個開始標簽,后跟一個標簽,該標簽不是與其剛剛找到的標簽相對應的結束標簽==>插入結束標簽。 例:
[a]text[b] ==> [a]text[/a][b] [a]text[/b] ==> [a]text[/a][/b]
(修正為2)。 搜索2個連續的結束標簽==>刪除第二個。 例:
[a]text[/a][/b] ==> [a]text[/a]
碼
$patterns = array ('#(\[/\w++])([^[]++\[/(\w++)])#',
'#\[(\w++)][^[]*+(?!\[/\1)#',
'#(\[/(\w++)])\[/\w++]#');
$replace = array ('\1[\3]\2',
'\0[/\1]',
'\1');
$string = "[a]text1[/a]text2[b]text3[c]text4[/c]text5[/b]\n[e]text6[f]text7[/e]text8[/f]";
$result = preg_replace($patterns, $replace, $string);
產量
[a]text1[/a]text2[b]text3[/b][c]text4[/c][b]text5[/b]
[e]text6[/e][f]text7[/f][f]text8[/f]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.