Fuelen » 2010.03.21 13:21

Вот такая http://fuelen.eeex.ru/bbcode.php
Регулярка
preg_replace_callback('#(?<!\['.$this->data['codetags'].'\]).*\[(\w+)\](.
+)\[/\\2\].*(?!\[/'.$this->data['codetags'].'\])#iuUs', array($this, 'simpleBB'), $text) в чём собственно ошибка?
Добавлено спустя   1 минуту  30 секунд:
$this->data['codetags'] = '(php|code)';

Gemorroj » 2010.03.21 13:38

Fuelen написал:

#(?<!\[

пологаю, проблема в этом.

Fuelen » 2010.03.21 13:59

Утверждения касательно последующего текста начинаются с (?= для положительных утверждений и с (?! для отрицающих утверждений.
Утверждения касательно предшествующего текста начинаются с (?<= для положительных утверждений и (?<! для отрицающих.
http://php.su/lessons/?lesson_17 здесь так пишет...

Gemorroj » 2010.03.21 14:43

Код:

1
2
3
4
5
6
7
8
9
10
11
class Test {
public function simpleBB () {
return 1;
}
public function b() {
preg_replace_callback('#(?<!\[php\]|\[code\]).*\[(\w+)\](.+)\[/\\2\].*(?!\[/(php|code)\])#iuUs', array($this, 'simpleBB'), 'sdfgsdhdgfg');
}
}
 
$x = new Test;
$x->b();

http://docs.php.net/manual/ru/regexp.reference.php

Утверждения касательно предшествующего текста начинаются с (?<= для положительных утверждений и (?<! для отрицающих. Например, (?<!foo)bar не найдёт вхождения "bar", которым не предшествует "foo". Сами утверждения 'назад' ограничены так, чтобы все подстроки, которым они соответствуют, имели фиксированную длину. Но, в случае, если используются несколько альтернатив, они не обязаны иметь одинаковую длину. Таким образом шаблон (?<=bullock|donkey) корректен, но (?<!dogs?|cats?) вызовет ошибку во время компиляции. Ветки, которые соответствуют строкам разной длины, разрешены только на верхнем уровне утверждений касательно предшествующего текста. Это расширение относительно Perl 5.005, который требует чтобы все ветки соответствовали строкам одинаковой длины. Такое утверждение как (?<=ab(c|de)) не корректно, поскольку верхний уровень маски может соответствовать строкам разной длины, но его можно преобразовать к корректному шаблону, используя альтернативы на верхнем уровне: (?<=abc|abde). Утверждения касательно предшествующего текста реализованы так, что для каждой альтернативы текущая позиция временно переносится назад, на фиксированную ширину, после чего выполняется поиск соответствия условию. В случае, если перед текущей позицией недостаточно символов, поиск соответствия терпит неудачу. Утверждения назад в сочетании с однократными подмасками могут быть особенно удобны для поиска в конце строки; соответствующий пример приведен в конце раздела "Однократные подмаски".

Ранее не приходилось как-то плотно работать с утверждениями)

Fuelen » 2010.03.21 14:53

Хы.. Спасибо :)

Fuelen » 2010.03.22 01:35

Вот ещё вопрос появился...
Как сделать, чтобы .*, что перед открывающим и после закрывающего ббкода в замену не входило? Если пишу типа (?=.*), то ошибка Compilation failed: lookbehind assertion is not fixed length

Gemorroj » 2010.03.22 07:58

убери модификатор U

Fuelen » 2010.03.22 18:58

Убрал.
Не сработало

Fuelen » 2010.03.22 21:18

Разобрался