Проблема регулярных выражений (PHP) - PullRequest
0 голосов
/ 04 марта 2010
[quote=Username here]quoted text here[/quote]

Reply text here

Мне нужно регулярное выражение, которое хранит "Имя пользователя здесь", "текст в кавычках здесь" и "Текст ответа здесь" в массиве.

Это выражение должно поддерживать также вложение. Eks:

[quote=Username2 here][quote=Username here]quoted text here[/quote]

Reply text here[/quote]

Reply text here

Ответы [ 2 ]

3 голосов
/ 04 марта 2010

Это регулярное выражение сопоставляет блок вложенных цитат (в группе 1) с дополнительным последним ответом (в группе 2):

(\[quote=[^]]*](?:(?R)|.)*\[/quote])(.*)

Немного демо:

$text = '[quote=Username2 here][quote=Username here]quoted text[/quote]Reply text[/quote]More text';
preg_match('#(\[quote=[^]]*](?:(?R)|.)*\[/quote])(.*)#is', $text, $match);
print_r($match);

производит:

Array
(
    [0] => [quote=Username2 here][quote=Username here]quoted text[/quote]Reply text[/quote]More text
    [1] => [quote=Username2 here][quote=Username here]quoted text[/quote]Reply text[/quote]
    [2] => More text
)

Небольшое объяснение:

(                  # open group 1
  \[quote=[^]]*]   #   match '[quote= ... ]'
  (?:(?R)|.)*      #   recursively match the entire pattern or any character and repeat it zero or more times
  \[/quote]        #   match '[/quote]'
)                  # open group 1
(                  # open group 2
  .*               #   match zero or more trailing chars after thae last '[/quote]'
)                  # close group 2

Но использование этих рекурсивных конструкций регулярных выражений, поддерживаемых PHP, может сделать головокружение ... Я бы выбрал небольшой анализатор, как предложил Джон Кугельман.

0 голосов
/ 04 марта 2010

Предполагая, что вы не хотите возвращать значения, вложенные каким-либо образом или с соответствующими кавычками - что невозможно в регулярном выражении - вы можете просто разбить на части, которые вам не нужны:

preg_split('/(\[quote=|\[quote]|]|\[/quote])/', $yourstring);
...