Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Превратить $conf[site] => $this->content[conf][site]
Форумы портала PHP.SU » PHP » Регулярные выражения » Превратить $conf[site] => $this->content[conf][site]

Страниц (1): [1]
 

1. Roler - 08 Ноября, 2010 - 10:08:14 - перейти к сообщению
Никак не получается написать регулярки для следующих преобразований:

CODE (text):
скопировать код в буфер обмена
  1. {$images["progress_bar"]}

в
CODE (text):
скопировать код в буфер обмена
  1. $this->content["images"]["progress_bar"]


и в тоже время

в
CODE (text):
скопировать код в буфер обмена
  1. $this->content["image"]



Пробую так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $this->file = preg_replace('#\{\$([^\[])(.*)\}#U','<?=$this->content["\1"]\2?>',$this->file);
  3.  



Однако, получается совсем не так, как хотелось бы:
CODE (text):
скопировать код в буфер обмена
  1. <?=$this->content["h"]ead?>



И да, конечно, желательны было бы обеспечить возможность бесконечной вложенности.
Уже столько голову ломаю... Улыбка
2. vitaliy_mad - 08 Ноября, 2010 - 13:04:06 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. echo preg_replace('/\$([^\[]+)\["(.+)"\]/U','$this->content["$1"]["$2"]','{$images["progress_bar"]}');
3. Roler - 08 Ноября, 2010 - 15:02:39 - перейти к сообщению
Спасибо, {$images['info']} он обрабатывает прекрасно, даже если там многомерный массив(я, правда, не до конца понимаю - как? Улыбка ), а вот просто {$image} никак.
Вторую регулярку для повторного обхода писать не хочется.
Может как-нибудь совместить?
4. vitaliy_mad - 08 Ноября, 2010 - 15:08:16 - перейти к сообщению
думаю лучше второй проход делать...
5. Roler - 08 Ноября, 2010 - 16:11:54 - перейти к сообщению
Просто с точки зрения логики выглядит то не сложно.

{$images["progress_bar"]}

Берём всё в {} до первой [ и преобразовываем, всё что дальше - переносим не трогая.
6. vitaliy_mad - 08 Ноября, 2010 - 17:25:23 - перейти к сообщению
а если первая [ аж в следующей конструкции?
7. Roler - 08 Ноября, 2010 - 19:19:35 - перейти к сообщению
Ну я поэтому и изображал нечто вроде {(всё, кроме [)(всё, что осталось)}
8. Roler - 09 Ноября, 2010 - 11:57:43 - перейти к сообщению
ОМГ, как-то странно оно работает.

PHP:
скопировать код в буфер обмена
  1. <?
  2. $text = '{$images} <br>  {$newage} <br> {$array["image"]}';
  3. echo preg_replace('/\$([^\[]+)\["(.+)"\]/U','$this->content["$1"]["$2"]',$text);
  4. ?>


CODE (htmlphp):
скопировать код в буфер обмена
  1. {$this->content["images}
  2. {$newage}
  3. {$array"]["image"]}
9. JustUserR - 09 Ноября, 2010 - 12:47:05 - перейти к сообщению
Roler пишет:
{$images['info']} он обрабатывает прекрасно, даже если там многомерный массив(я, правда, не до конца понимаю - как?
Использование аргументов индексных и ассоциативных массивов для встроенных строковых функций и обрабочиков шаблонов регулярных выражений - обеспечивает в общем случае применение некоторого обобщеного значение которое зависит от целевой функции В частности в зависимости от используемого контекста компоненты массива могут использоваться как для последовательской обработки - так и проведения интерполяции значений
10. Roler - 09 Ноября, 2010 - 15:28:47 - перейти к сообщению
Решено так:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $this->file = preg_replace('#\{\$([a-z0-9_\-]+)([^\}]*)\}#s','<?=$this->content["\\1"]\\2?>',$this->file);
11. JustUserR - 09 Ноября, 2010 - 21:44:52 - перейти к сообщению
Roler Возможно для применения созданного вами регулярного выражения в общем случае для разветвленной структуры анализируемого документа - целесообразно использования нежадный вариант квантификаторов для предотвращения трактования блока схожих по синтаксису элементов в единое целое
12. Roler - 09 Ноября, 2010 - 23:06:50 - перейти к сообщению
JustUserR
Я обычно инвертирую жадность, но тут без неё получается прекрасно.

P.S. Раньше таких усложнённых конструкций у вас не замечал. Тонкий троллинг или что? Улыбка
13. JustUserR - 11 Ноября, 2010 - 09:46:45 - перейти к сообщению
Roler пишет:
JustUserR Я обычно инвертирую жадность, но тут без неё получается прекрасно.
В действительности возможно приведенное вами регулярое выражение может обеспечивать требуемую замену в общем без инвертирования жадности квантификаторов - одако в таком случае источником неправильной замены может являться наличие шаблона правила замены в виде вхождения ключа искомного ассоциативного массива Улыбка

 

Powered by ExBB FM 1.0 RC1