php preg_replace help Сбой компиляции: несоответствующие скобки

Не уверен, что я просто тупой или что-то в этом роде, но здесь я работаю на Shape5.com, и я сделал там Vertex Framework. Проблема в том, что Joomla постоянно обновляется, и это появлялось на наших форумах несколько раз. Ошибка: Предупреждение: preg_replace() [function.preg-replace]: ошибка компиляции: несоответствующие скобки со смещением 67

это наш код

<?php
$script = "Hello window.addEvent('domready', function(){ new Fx.Accordion($$('div#template-sliders-116.pane-sliders > .panel > h3.pane-toggler'), $$('div#template-sliders-116.pane-sliders > .panel > div.pane-slider'), {onActive: function(toggler, i) {toggler.addClass('pane-toggler-down');toggler.removeClass('pane-toggler');i.addClass('pane-down');i.removeClass('pane-hide');Cookie.write('jpanesliders_template-sliders-116',$$('div#template-sliders-116.pane-sliders > .panel > h3').indexOf(toggler));},onBackground: function(toggler, i) {toggler.addClass('pane-toggler');toggler.removeClass('pane-toggler-down');i.addClass('pane-hide');i.removeClass('pane-down');if($$('div#template-sliders-116.pane-sliders > .panel > h3').length==$$('div#template-sliders-116.pane-sliders > .panel > h3.pane-toggler').length) Cookie.write('jpanesliders_template-sliders-116',-1);},duration: 300,opacity: false,alwaysHide: true}); });";
$script = preg_replace("/window.addEvent('domready', function(){ new Fx.Accordion(.*?)}); });/", '', $script);
echo $script;
?>

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

Смещение 67 - последнее) и да, я попытался убежать, удалив его, назовите это, я попытался:D

Могу поспорить, что-то простое LOL

Спасибо Дэйв

1 ответ

Решение

Скобки - это специальные символы в PCRE для группировки захвата, которые требуют экранирования через обратную косую черту, как и {} которые в противном случае были бы спецификаторами диапазона, и точка .,

$script = preg_replace("/window\.addEvent\('domready', function\(\)\{ new Fx.Accordion\(.*?\)\}\); \}\);/", '', $script);

Я думаю, что у меня все правильно сбежало. Я предполагаю (.*?) не был предназначен для захвата группы. ? на самом деле нет необходимости там, потому что .* подразумевает ноль или более любого символа.

$script = preg_replace("/window\.addEvent\('domready', function\(\)\{ new Fx.Accordion(.*?)\}\); \}\);/", '', $script);
//-----------------------------------------------------------------------Don't escape ^^^^^

Обновление: если (.*?) был задуман как несвободная спичечная группа, тогда не избегайте этого.

Другие вопросы по тегам