2012-02-03 5 views
1

короткие номера я пытаюсь найти все шорткоды в строку, которая выглядит следующим образом:Regular Expression с WordPress

 [a_col] One 

 [/a_col] 

outside 
[b_col] 

Two 

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

Мне нужно содержание (например, «Три») и письмо от седловины (а, б или в) Вот выражение я использую

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

но $ хитами содержит только последний.

содержание может иметь любой характер, даже «[» или «]»

EDIT:

Я хотел бы получить «снаружи», а что может быть любая строка (кроме этих перевалы) , Как я могу это обработать или должен ли я проанализировать это на втором шаге?

+2

Wordpress имеет функцию для этого уже, вам не нужно повторно изобретать колесо. Готов поспорить, что лучше работать, чем любой из предложенных ответов, потому что wordpress знает, что такое короткий код, а что нет - и в каком порядке инкапсулированные должны обрабатываться. Береги себя. – hakre

+0

Очень правдиво, я планирую попробовать и реструктурировать свой плагин, чтобы использовать сборку в коротких кодах, если это возможно, но, к сожалению, моему плагину необходимо извлечь из него короткий код, отформатировать его, а затем поместить обратно, и это должно произойти в заданном порядке. Надеюсь, я выясню путь, но сейчас я делаю это вручную. –

+0

Согласитесь, но это для настраиваемого редактора, и мне это нужно так – Xaver

ответ

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); 

?> 

EDIT:

Вы можете затем обрезать спички, так как он появляется там могут быть некоторые пробелы. Кроме того, вы можете использовать регулярное выражение для удаления пробелов в содержании:

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

ВЫВОД:

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

+0

Я добавил некоторую информацию об атрибутах –

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

+0

Да, его ответ очень тщательный! Даже предотвращение возможных будущих проблем. Я бы пошел с его ответом :-) –

0

У меня нет среды, я могу проверить с здесь, но вы можете использовать вид сзади и смотреть вперед утверждение и обратную ссылку для соответствия меток вокруг содержимого. Что-то вроде этого.

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