這將捕獲內容中的任何內容以及屬性,並允許內容中的任何字符。
<?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]
陣列。
WordPress已經有了一個功能,你不需要重新發明輪子。我敢打賭,它比任何建議的答案都更好,因爲wordpress知道短代碼是什麼,什麼不是 - 以及封裝代碼的處理順序。保重。 – hakre 2012-02-03 10:45:50
非常真實,我計劃嘗試重構我的插件以儘可能在短代碼中使用構建,但不幸的是,我的插件需要將短代碼從帖子中提取出來,然後將其格式化,然後將其重新放入,並且必須發生這種情況按照設定的順序。希望我找出一種方法,但現在我手動執行。 – 2012-02-03 10:47:52
同意,但這是一個自定義編輯器,我需要這種方式 – Xaver 2012-02-03 10:50:42