2012-02-03 27 views
1

我試圖找到它看起來像這樣的字符串中的所有簡碼:正則表達式與WordPress的簡

 [a_col] One 

 [/a_col] 

outside 
[b_col] 

Two 

[/b_col] [c_col] Three [/c_col] 

我需要從山坳的內容(例如「三」)和字母(A, b或C) 下面是我使用

preg_match_all('#\[(a|b|c)_col\](.*)\[\/\1_col\]#m', $string, $hits); 

表達,但$命中只包含最後一個。

內容可以有任何字符,甚至「[」或「]」

編輯:

我想獲得「外」,以及它可以是任何字符串(除了這些的cols) 。我該如何處理這個問題,還是應該在第二步中解析這個問題?

+2

WordPress已經有了一個功能,你不需要重新發明輪子。我敢打賭,它比任何建議的答案都更好,因爲wordpress知道短代碼是什麼,什麼不是 - 以及封裝代碼的處理順序。保重。 – hakre 2012-02-03 10:45:50

+0

非常真實,我計劃嘗試重構我的插件以儘可能在短代碼中使用構建,但不幸的是,我的插件需要將短代碼從帖子中提取出來,然後將其格式化,然後將其重新放入,並且必須發生這種情況按照設定的順序。希望我找出一種方法,但現在我手動執行。 – 2012-02-03 10:47:52

+0

同意,但這是一個自定義編輯器,我需要這種方式 – Xaver 2012-02-03 10:50:42

回答

2

這將捕獲內容中的任何內容以及屬性,並允許內容中的任何字符。

<?php 

$input = '[a_col some="thing"] One[/a_col] 
[b_col] Two [/b_col] 
[c_col] [Three] [/c_col] '; 

preg_match_all('#\[(a|b|c)_col([^\[]*)\](.*?)\[\/\1_col\]#msi', $input, $matches); 

print_r($matches); 

?> 

編輯:

您可能需要再修剪一下比賽,因爲它似乎可能會有一些空白。另外,您也可以使用正則表達式的內容刪除空格:

preg_match_all('#\[(a|b|c)_col([^\[]*)\]\s*(.*?)\s*\[\/\1_col\]#msi', $input, $matches); 

OUTPUT:

Array 
(
    [0] => Array 
     (
      [0] => [a_col some="thing"] One[/a_col] 
      [1] => [b_col] Two [/b_col] 
      [2] => [c_col] [Three] [/c_col] 
     ) 

    [1] => Array 
     (
      [0] => a 
      [1] => b 
      [2] => c 
     ) 

    [2] => Array 
     (
      [0] => some="thing" 
      [1] => 
      [2] => 
     ) 

    [3] => Array 
     (
      [0] => One 
      [1] => Two 
      [2] => [Three] 
     ) 

) 

它也可能會有所幫助使用此捕獲存儲在$matches[2]屬性名稱和值。考慮$atts$matches[2]中的第一個元素。當然,將迭代屬性數組並在每個屬性上執行此操作。

preg_match_all('#([^="\'\s]+)[\t ]*=[\t ]*("|\')(.*?)\2#', $atts, $att_matches); 

這給出其中名稱存儲在$att_matches[1]和它們相應的值被存儲在$att_matches[3]陣列。

+1

謝謝,這完全符合我的需要。此外,它的屬性準備 – Xaver 2012-02-03 10:35:46

+0

我添加了一些屬性信息 – 2012-02-03 10:45:15

1

的使用((.|\n)*)(.*),而不是捕捉到多行...

<?php 
$string = " 
[a_col] One 

[/a_col] 
[b_col] 

Two 

[/b_col] [c_col] Three [/c_col]"; 
    preg_match_all('#\[(a|b|c)_col\]((.|\n)*)\[\/\1_col\]#m', $string, $hits); 

    echo "<textarea style='width:90%;height:90%;'>"; 
    print_r($hits); 
    echo "</textarea>"; 
?> 
+0

謝謝你!按預期工作,但我會用@AramKocharyan的解決方案去解決 – Xaver 2012-02-03 10:37:18

+0

是的,他的回答非常徹底!甚至預見未來可能出現的問題。我會和他的回答一起去:-) – 2012-02-05 15:08:29

0

我沒有一個環境,我可以在這裏測試,但你可以使用後面一看,向前看斷言和一個反向引用以匹配內容周圍的標籤。像這樣的東西。

(?<=\[(\w)\]).*(?=\[\/\1\])