簡體   English   中英

PHP中是否有一個(遞歸的)PCRE正則表達式來標記標簽

[英]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次替換:

  1. 搜索結束標記,然后搜索另一個結束標記==>為第二個插入開始標記。 例:

     [/b]text[/c] ==> [/b][c]text[/c] 
  2. 搜索一個開始標簽,后跟一個標簽,該標簽不是與其剛剛找到的標簽相對應的結束標簽==>插入結束標簽。 例:

     [a]text[b] ==> [a]text[/a][b] [a]text[/b] ==> [a]text[/a][/b] 
  3. (修正為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM