Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Исключить вложенные тэги


Автор: spamoney 9.8.2011, 12:12
Здравствуйте, есть текст:
Код
$str=' 
[spoiler] 
Спойлер-1 
[/spoiler] 
[spoiler] 
Спойлер-2 
  [spoiler] 
  Спойлер-2-1 
  [/spoiler] 
  [spoiler] 
  Спойлер-2-2 
    [spoiler] 
    Спойлер-2-2-1 
    [/spoiler] 
  [/spoiler] 
  [spoiler] 
  Спойлер-2-3 
  [/spoiler] 
[/spoiler] 
[spoiler] 
Спойлер-3-s [ ]
[/spoiler] 
';

Нужна регулярка, которая бы нашла текст между [ spoiler] [ /spoiler], в которых нет вложенного [spoiler], т.е из текста выше регулярка должна вернуть:
Код
[0]=>Спойлер-1
[1]=>Спойлер-2-1
[2]=>Спойлер-2-2-1
[3]=>Спойлер-2-3
[4]=>Спойлер-3-s [ ]


Понимаю, что нужно как-то использовать негативный просмотр вперёд/назад, что-то вроде:

Код

preg_match_all('#\[spoiler\](.*?)(?!\[spoiler\])\[/spoiler\]#', $str, $matches);


но что-то не получается...

Автор: NLspieler 9.8.2011, 21:32
Код

$text = '[spoiler] 
Спойлер-1 
[/spoiler] 
[spoiler] 
Спойлер-2 
  [spoiler] 
  Спойлер-2-1 
  [/spoiler] 
  [spoiler] 
  Спойлер-2-2 
    [spoiler] 
    Спойлер-2-2-1 
    [/spoiler] 
  [/spoiler] 
  [spoiler] 
  Спойлер-2-3 
  [/spoiler] 
[/spoiler] 
[spoiler] 
Спойлер-3-s [ ]
[/spoiler]';

$text = str_replace('[spoiler]', '리', $text);
$pattern = '|리([^리]+)\[/spoiler\]|Uus' ;
preg_match_all ($pattern , $text, $matches);
print_r($matches);

Автор: Evghenusi 3.9.2011, 03:25
Код

|\[spoiler\]((?:(?!\[/?spoiler\]).)*?)\[/spoiler\]|s

Код
Всего совпадений 5

1 : [spoiler\] Спойлер-1 [/spoiler\]
1.1 : Спойлер-1

2 : [spoiler] Спойлер-2-1 [/spoiler]
2.1 : Спойлер-2-1

3 : [spoiler] Спойлер-2-2-1 [/spoiler]
3.1 : Спойлер-2-2-1

4 : [spoiler] Спойлер-2-3 [/spoiler]
4.1 : Спойлер-2-3

5 : [spoiler] Спойлер-3-s [ ] [/spoiler]
5.1 : Спойлер-3-s [ ] 

Автор: spamoney 3.9.2011, 05:17
Evghenusi, огромное спасибо!!)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)