Отрицание строки в регулярном выражении - PullRequest
0 голосов
/ 09 сентября 2011

Я понимаю, что что-то подобное уже задавалось ранее, но я не могу соответствовать решению того, что я пытаюсь сделать, поэтому, пожалуйста, не думайте, что это обман.

У меня есть строка в стиле {block:string}contents{/block:string}, которую можно легко сопоставить с {block:([a-z_-\s]+)}.*{/block:\1}

Что я хочу сделать, так это изменить внутреннюю часть. * Так, чтобы она не соответствовала любой строке, в которой есть {block:[a-z_-\s]+}, то есть все {block} {/ block}, которые имеют {блок} внутри них не должен совпадать.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

Сжатый: m~\{block:([a-z\s_-]+)\}(?:(?!\{/?block:\1\}).)*\{/block:\1\}~xs

Пример на Perl:

$_ = '{block:string}conte{block:string}nts{/block:string}{/block:string}';

if ( m~    # match operator

        \{block: ([a-z\s_-]+) \}   # opening block structure and capt grp 1

        (?:                        # begin non capt grp
            (?! \{/?block: \1 \} )     # negative lookahead, don't want backreffed
                                       # open or closed block struct    
            .                          # ok, grab this character
        )*                         # end group, do 0 or more times (greedy)

        \{/block: \1 \}            # closing block structure matching grp 1 

  ~xs )    # modifiers: expanded, include newlines 

{
   print "matched '$&'\n";
}

Вывод:
соответствует '{блок: строка} nts {/ блок: строка}'

2 голосов
/ 09 сентября 2011

Попробуйте

{block:([a-z_-\s]+)}[^{]*(?!{block:([a-z_-\s]+)}.*{\block:\2})[^}]*{/block:\1}

Я довольно посредственный в регулярных выражениях, но отрицательный взгляд, ограниченный операторами [^ {] * и [^}] *, должен держать ваши совпадения без тегов.

1 голос
/ 09 сентября 2011
<?php 
$ptn = "%(?:{block:[a-z_\s-]+})(?![^}]*?{block:).*?{/block:[a-z_\s-]+}%";
$str = "... your content here ...";
preg_match_all($ptn, $str, $matches);
print_r($matches);
?>

Например:

$str = "{block:string}test2{/block:string} {block:string}contents{block:string}{block:string}test3{/block:string}{/block:string}{/block:string} sdf ";

Будет производить:

Array
(
[0] => Array
    (
        [0] => {block:string}test2{/block:string}
        [1] => {block:string}test3{/block:string}
    )
)
...