IF/ELSE шаблоны

AKAPE

Новичок
IF/ELSE шаблоны

как грамотно сделать блоки IF - ELSE своем маленьком шаблоне без вставки php кода, preg_replace по идее напрягать не очень хочется, да и добавляет он свои сляши...

-~{}~ 09.05.04 03:34:

eval()-ить IF выражение, но это не совсем секьюрно же.
 

AKAPE

Новичок
есть HTML файлы, в них строки в которых содержаться условия:

<html>
<body>

{if|1==1}
<h1>1 equals 1</h1>
{else}
<h1>1 does not equal 1</h1>
{endif}

</body>
</html>

вот это и нужно быстро и грамотно распарсить
 

Leek

Новичок
А что за шаблонизатор юзается?
Вообще, хранить реплэйсменты для
"{if|1==1}" => "if 1 == 1"
"{else}" => "else"
"{endif}" => "endif".
А потом eval'ить полученный html. Но, imho, штука жуткая выйдет.
Лучше, все-таки, проверку вне шаблона делать.
preg_replace по идее напрягать не очень хочется
preg_replace() существует, в принципе, только одна альтернатива - ereg_replace(). В любом случае regexps. А stripslashes() сделать - проблема разве?
 

lucas

Guest
AKAPE

Не стоит изобретать велосипед.
Используй готовые решения, например Smarty (http://smarty.php.net/).
А время, которое ты потратишь на написание собственного шаблонного движка, можно использовать с гораздо большей пользой.
 

AKAPE

Новичок
Дело в том, что не хочеться пользоваться массивными классами, там всего то и нужно в моем движке - это заменить переменные и if-ы, тем более время не приоритет, хочется сделать свое и хочеться знать как это сделать правильно.
 

AKAPE

Новичок
хочеться: панисать своё и понять как это сделать правильно, даже если изобретаю велосипед

НЕ хочеться: использовать готовые классы (написаные НЕ мной)
 

SiMM

Новичок
Автор оригинала: AKAPE
там всего то и нужно в моем движке - это заменить переменные и if-ы
Зачем для этого шаблоны вообще? Не вижу принципиальной разницы между
Код:
{if|1==1}
<h1>1 equals 1</h1>
{else}
<h1>1 does not equal 1</h1>
{endif}
и
PHP:
<?if (1==1):?>
<h1>1 equals 1</h1>
<?else:?>
<h1>1 does not equal 1</h1>
<?endif;?>
По времени - так второй вариант побыстрее будет.
 

AKAPE

Новичок
эти шаблоны должны будут обрабатываться не только php, но и ПЕРЛ-ом, так бы я не замарачивался конечно же.

-~{}~ 09.05.04 15:45:

Вот ,что получилось, прошу критики :)
PHP:
<?php

class template{
	var $dat;

	function open($path)
	{
		if(!file_exists($path))
		{
			trigger_error("file: ".$path." does not exist");
		}
		$this->dat=file_get_contents($path);
	}

	function parse()
	{
		$this->dat=str_replace("{\$_self}",$_SERVER['PHP_SELF'],$this->dat);
		$this->dat=str_replace("{\$_sess}",session_id(),$this->dat);
		$this->dat=preg_replace_callback("/\{\\\$([a-z_][a-z0-9_]*)(?:\[([a-z0-9_-]*)\])?(?:\[([a-z0-9_-]*)\])?\}/",array($this,"variable"),$this->dat);
		$this->dat=preg_replace_callback("/\{if\|(.+?(?:==|>|<|>=|<=).+?)\}(.+?)\{endif\}/s",array($this,"condition"),$this->dat);
	}
	
	function condition($var)
	{
		$var[2]=str_replace("\\'","'",$var[2]);
		if(strpos($var[2],"{else}")!==false)
		{
			$buf=explode("{else}",$var[2]);
		}
		eval("\$tmp=".$var[1].";");
		if($tmp===true)
		{
			return isset($buf) ? $buf[0] : $var[2];
		}
		return isset($buf) ? $buf[1] : "";
	}
	
	function variable($var)
	{
		if($var[2]=="")
		{
			if(isset($GLOBALS[$var[1]]))
			{
				return $GLOBALS[$var[1]];
			}
			else
			{
				return "parse error";
			}
		}
		if($var[3]=="")
		{
			if(isset($GLOBALS[$var[1]][$var[2]]))
			{
				return $GLOBALS[$var[1]][$var[2]];
			}
			else
			{
				return "parse error";
			}	
		}
		if(isset($GLOBALS[$var[1]][$var[2]][$var[3]]))
		{
			return $GLOBALS[$var[1]][$var[2]][$var[3]];
		}
		return "parse error";
	}
}

?>
 
Сверху