Вы не зашли.
Главная » PHP » Ошибка в регулярке
#1. Fuelen Off (5)
Участник
2010.03.21 13:01
Вот такая 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)';
Отредактировано Fuelen (2010.03.21 13:01)
на хую вас вертів
#2. Gemorroj Off (107)
Administrator
2010.03.21 13:01
Fuelen написал:
#(?<!\[
пологаю, проблема в этом.
#3. Fuelen Off (5)
Участник
2010.03.21 13:01
Утверждения касательно последующего текста начинаются с (?= для положительных утверждений и с (?! для отрицающих утверждений.
Утверждения касательно предшествующего текста начинаются с (?<= для положительных утверждений и (?<! для отрицающих.
http://php.su/lessons/?lesson_17 здесь так пишет...
на хую вас вертів
#4. Gemorroj Off (107)
Administrator
2010.03.21 14:02
Код:
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). Утверждения касательно предшествующего текста реализованы так, что для каждой альтернативы текущая позиция временно переносится назад, на фиксированную ширину, после чего выполняется поиск соответствия условию. В случае, если перед текущей позицией недостаточно символов, поиск соответствия терпит неудачу. Утверждения назад в сочетании с однократными подмасками могут быть особенно удобны для поиска в конце строки; соответствующий пример приведен в конце раздела "Однократные подмаски".
Ранее не приходилось как-то плотно работать с утверждениями)
#5. Fuelen Off (5)
Участник
2010.03.21 14:02
Хы.. Спасибо smile
на хую вас вертів
#6. Fuelen Off (5)
Участник
2010.03.22 01:01
Вот ещё вопрос появился...
Как сделать, чтобы .*, что перед открывающим и после закрывающего ббкода в замену не входило? Если пишу типа (?=.*), то ошибка Compilation failed: lookbehind assertion is not fixed length
Отредактировано Fuelen (2010.03.22 18:06)
на хую вас вертів
#7. Gemorroj Off (107)
Administrator
2010.03.22 07:07
убери модификатор U
#8. Fuelen Off (5)
Участник
2010.03.22 18:06
Убрал.
Не сработало
на хую вас вертів
#9. Fuelen Off (5)
Участник
2010.03.22 21:09
Разобрался
на хую вас вертів
Страниц: 1
Главная
WEB
PunBB Mod v0.6.2
0.014 s