Задача: [сделать в шаблоне возможность выполнять PHP код оптимально оптимизированно]

tolst

Новичок
Задача: [сделать в шаблоне возможность выполнять PHP код оптимально оптимизированно]

В общем есть такая чтука:
PHP:
<?php

$string = "<html><head>[PНP]echo 'test1';[/PНP]</head><body>[PНP]echo 'test2';[/PНP]</body></html>";

// Тут в общем мы должны реализовать вставку выполняемого PHP кода на понятное каждому место =)
// Я сделал, но производительность скриптика резко упала, хотелось бы посмотреть (желательно в примерах) как можно реализовать данную траблу

echo $string;

?>
Фанат, плииз, не шли меня как всегда в маны =)
Заранее благодарен за ответы.
ЗЫ: так как этот форум понимает теги PHP я заменил английскую h на русскую н

PS: в своём варианте я юзаю ob_start для ловли выполненного по eval() контента
 

.des.

Поставил пиво кому надо ;-)
eval замените на include и $string храните в файлах.

Если источник $string это база, то через файлы всегда можно организовать кэширование. Зачем "
PHP:
" когда можно "<?php ?>" ?
 

tolst

Новичок
> eval замените на include
Смысл? в таком случае мне придётся создать файл, сделать include потом удалить его....

> $string храните в файлах.
шаблон само сабой в файле, вернее в отдельно файле, здесь пример для наглядности

> Если источник $string это база то через файлы организовать кэширование, зачем когда можно <?php ?>
кусочки $string берутся из базы... речи о кешировании тут нет. речь просто о том, что нужно реализовать максимально оптимально запрашиваемый алгоритм... для того, чтобы в моём горе шаблонизаторе была возможность вставки PHP кода прямо в шаблон....
 

SiMM

Новичок
> в таком случае мне придётся создать файл, сделать include потом удалить его....
Зачем что-то удалять? Кроме того
> шаблон само сабой в файле

В общем, я так понимаю, .des. имел в виду это

> кусочки $string берутся из базы...
Ну напишите тогда свой враппер чтоли.
[m]stream_wrapper_register[/m]
 

tolst

Новичок
В общем перефразирую немного задачу:
1) Нужно все [PНP]что то[/PНP] вытащить
2) Выполнить при помощи eval & ob_start
3) Засунуть выполненное на прежнее место
 

ksnk

прохожий
А вот такое подойдет?
- пропарсить строку на предмет замены
PHP:
 на <?php>
 - сохранить строку в файл myfile.php
 - открыть ее - fopen('html://.../myfile.php')
 - вставить вывод куда надо...

Лучший парсер PHP - сам PHP :)
 

.des.

Поставил пиво кому надо ;-)
2 tolst вообще не хотите слушать советов, ваше право :)
1) Нужно все [PНP]что то[/PНP] вытащить
2) Выполнить при помощи eval & ob_start
preg_replace_callback, preg_replace модификатор /e


2 ksnk
- открыть ее - fopen('html://.../myfile.php')
Это что еще такое ? :)
 

tolst

Новичок
Автор оригинала: ksnk
А вот такое подойдет?
- пропарсить строку на предмет замены
PHP:
 на <?php>
 - сохранить строку в файл myfile.php
 - открыть ее - fopen('html://.../myfile.php')
 - вставить вывод куда надо...

Лучший парсер PHP - сам PHP :)[/QUOTE]
Понимаешь, обработка идёт в realtime, тоесть парсить нужно в реалтайме, твой вариант далеко не оптимален, этот механизм будет выполняться намного дольше и тормазнее....

[size=1][i]-~{}~ 01.10.05  20:12:[/i][/size]

> preg_replace_callback, preg_replace модификатор /e
а можно конкретный примерчик? просто в конкретно в моём выполненном примере используется preg_match_all
 

SiMM

Новичок
> 1) Нужно все [PНP]что то[/PНP] вытащить
Это как бы абсолютно не объясняет, почему вместо пары &#91;PHP] код &#91;/PHP] вам не подходит пара <? код ?>
 

tolst

Новичок
Потаму, что этот код в строке....
тоесть он первоночально в файле, но потом я его считываю в переменную и обрабатываю его... а потом echo $template...

-~{}~ 02.10.05 02:10:

Теперь такая проблема... вот шаблон:
PHP:
<html>
%PHP.Start%
echo 'test';
%PHP.End%
bla bla lba
</html>
вот скрипт:
PHP:
// Считываем шаблон в одну строку $template
echo preg_replace_callback("|%PHP.Start%(.*)%PHP.End%|", "ReplacePHPCode", $template);

function ReplacePHPCode($matches) {
	ob_start();
	eval($matches[1]);
	$php_output = ob_get_contents();
	ob_end_clean();
	return $php_output;
}
Эта чтука неработает если междку в шаблоне есть нечто подобное:
%PHP.Start%
echo 'test';
%PHP.End%

а когда всё в одну строку:
%PHP.Start%echo 'test';%PHP.End%
работает...

как вылечить?
 

tolst

Новичок
"s" модификатор меня вылечил =)
сенкс...

-~{}~ 02.10.05 03:54:

Появилась ещё одна проблема:
когда в шаблоне встречается больше одной такой вставки, ошибочки лезут =(. Вот данные:

Шаблон:
PHP:
<html> 
%PHP.Start% 
echo 'test1'; 
%PHP.End% 
bla bla lba 
%PHP.Start% 
echo 'test2'; 
%PHP.End% 
</html>
вот скрипт:

// Считываем шаблон в одну строку $template
echo preg_replace_callback("|%PHP.Start%(.*)%PHP.End%|s", "ReplacePHPCode", $template);

function ReplacePHPCode($matches) {
ob_start();
eval($matches[1]);
$php_output = ob_get_contents();
ob_end_clean();
return $php_output;
}
 

SelenIT

IT-лунатик :)
Потаму, что этот код в строке....
тоесть он первоночально в файле, но потом я его считываю в переменную и обрабатываю его... а потом echo $template...
По-моему,
Это как бы абсолютно не объясняет, почему вместо пары [РНР] код [/РНР] вам не подходит пара <? код ?>
 

tolst

Новичок
preg_replace с модификатором e попробывал, не катит... не то что мне нужно... =(

-~{}~ 02.10.05 06:45:

> Hint: greed
UNGREEDY вылечило ;) сенкс... тока блин жаль что ты сразу не написал, я потратил ровно полтора часа на эту хренову загадку =))
 

ksnk

прохожий
Imho подход к задаче не совсем правильный. Нужно шаблон парсить на код, который не входит в [ php]-втавки и код, который входит и делать одну большую сроку. которую уже обрабатывать eval'ом.
К примеру
Код:
<html> 
%PHP.Start% 
$start = 0 ; 
%PHP.End% 
bla bla lba 
%PHP.Start% 
echo $start; 
%PHP.End% 
</html>
перейдет в
PHP:
echo '<html>';
$start=0; 
echo 'bla bla lba ';
echo $start;
echo '</html>';
К чему это я? Если в первой вставке определяется переменная, есть ли уверенность что ее значение будет доступно из второй? Imho, если не использовать глобальные константы, то и не будет, а, наверное, хочется :)
Или к примеру, цикл написать на весь шаблон...
 
Сверху