2015-02-03 4 views
-1

Нужна помощь с регулярным выражением.Регулярное выражение. Избегайте соответствия строки до тех пор, пока не будет выполнено условие?

Строка: (может содержать больше уровней "тест")

[test] 
[inner] 
    [test] 
     [inner]*anything* 
     [/inner] 
    [/test] 
[/inner] 
[/test] 

[test] 
    [inner]*anything* 
    [/inner] 
[/test] 

должны соответствовать:

1.

[test] 
[inner] 
    [test] 
     [inner]*anything* 
     [/inner] 
    [/test] 
[/inner] 
[/test] 

2.

[test] 
    [inner]*anything* 
    [/inner] 
[/test] 

Вопрос:

Как написать регулярное выражение, которое соответствует разыскиваемого результат в PHP?

Вот мой пример: https://regex101.com/r/tA2wN8/2

+2

И вопрос в том, что? – Havelock

+0

Ожидаете ли вы ответа на JavaScript или PHP? –

+0

Нужно это в PHP. Ответ Казимира и Ипполита в порядке. – code9

ответ

1

Вы должны использовать рекурсивный шаблон:

~\[test](?:[^[]+|\[(?!/?test])|(?R))*+\[/test]~ 

детали:

~      # pattern delimiter 
\[test] 
(?:     # non-capturing group (possible content between test tags) 
    [^[]+    # all that is not a [ 
    | 
    \[(?!/?test])  # a [ not part of a test tag (opening or closing) 
    | 
    (?R)    # repeat the whole pattern (recursion) 
)*+     # repeat the group zero or more times (possessive quantifier) 
\[/test] 
~ 

Примечание таким образом можно только Жека PHP или Perl, есть это не способ для Javascript, который не имеет функции рекурсии.

Смежные вопросы