[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Шаблонизатор: substr о_О
Gesandte
Добрый день.
Собственн для движка пытаюсь нахимичить шаблонизатор.
Конкретно пользовательская функция в которой и применяется substr, должна разать строку на 2 части, вырезая спец. тег, который потом будет заменяться.

Но несмотря на кажущуюся простоту что то не так......
Строка передается в функцию, все позиции для резки строки рассчитаны, но.....


echo "start str - "; echo $str_start = substr($str, 0, $a);


По идеи в данном случае мы должны получить часть строки от начала, длинной символов $a, но на выходе ничего, 0 в данном случае как я понял почему ту интерпритируется как false, соответственно если мы вместо 0 напишем к примеру 1 или 2, то на выходе получим строку, но со сдвигом на n-ое количество символов.

Как не пытался ркшить данную проблему, не удалось, при этом в совсем в другом куске кода и в другой пользовательской функции имеем
$notice = substr($text, 0, $position);

но тут все работает как надо.

Спасибо за внимание.



Спустя 15 минут, 24 секунды (19.06.2010 - 13:18) waldicom написал(а):
У меня все работает... Вы проверяли значения $str и $a ?

Спустя 50 минут, 17 секунд (19.06.2010 - 14:09) Gesandte написал(а):
да в том то и дело что уже проверил все что можно, но со str и впарвду косяк непонятный...

щас тогда весь код выложу, иначе опять работа встанет...

<?php

class
templater {

public $templater_tag = array();
public $templater_file = array();
public $templater_position = array();

function parse_tmpl($str) {

if (($this->templater_position[start] = strpos($str, $this->templater_tag[start])) !== false) {
# Открывающий тег найден
echo $this->templater_position[start] += strlen($this->templater_tag[start]);

# Ищем закрывающий тег
if (($this->templater_position[end] = strpos($str, $this->templater_tag[end])) !== false) {
# Определяем длинну строки
$this->templater_position[length] = $this->templater_position[end] - $this->templater_position[start];

# Выделяем содержимое
$templater_tag[id] = substr($str, $this->templater_position[start], $this->templater_position[length]);
echo $templater_tag[id] = trim($templater_tag[id]);

# Парсим исходную строку
$this->replace_tmpl($str);
} else {
# Закрывающий тег не найден
echo "Syntax error, no end tag";
}
}
}


function replace_tmpl($str) {
echo $str;
echo "start : ";
echo $this->templater_position[start]; echo " - "; echo strlen($this->templater_tag[start]); echo " = ";
echo $a = $this->templater_position[start] - strlen($this->templater_tag[start]);
echo "<br />";
echo "start str - "; echo $str_start = substr($str, 1, $a);
echo "<br />";
echo "end : ";
echo $f = $this->templater_position[end] + strlen($this->templater_tag[end]);
echo "<br />";
echo $str_end = substr($str, $f);
echo "<br />";
echo "______________________________________";
echo "<br />";
# Подмена
.....
}

}


$templater = new templater();

$templater->templater_tag[start] = "<$--";
$templater->templater_tag[end] = "-->";
$templater->templater_file[initial] = "test.html";
$templater->templater_file[tmpl] = "temp.html";

if (file_exists($templater->templater_file[initial])) {
$templater_file[f_initial] = file($templater->templater_file[initial]);

$templater_file[f_tmpl] = fopen($templater->templater_file[tmpl], "w+") or die("Erorr open file");

# Прогоняем файл
foreach ($templater_file[f_initial] as $str) {
$templater->parse_tmpl($str);

fputs($templater_file[f_tmpl], $str);
}

# Закрываем файл
fclose($templater_file[f_tmpl]);
} else {
echo "file not found";
}

?>


test.html


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=<$-- CHARSET -->">
<title>
<$-- TITLE --></title>
<link
href="style.css" rel="stylesheet" media="screen" type="text/css">
</head>
<body>

<div
class="header">
<$-- HEADER -->
</div>

<div
class="left">
<a
href="http://validator.w3.org/check?uri=referer">
<img
src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01 Strict" height="31" width="88">
</a>
</div>

<div
class="right">
</div>

<div
class="footer">
<p>
<$-- FOOTER --></p>
</div>

</body>
</html>



По поводу моего ооп особо не упоминайте,сам знаю что в нем особо ничего не смыслю)))

Спустя 3 часа, 15 минут, 7 секунд (19.06.2010 - 17:24) qpayct написал(а):
я пару дней назад снял шаблонизатор с сайта и сам лично на свои сайты писать шаблонизаторы больше не буду. разница в скорости в 50-60 раз

Спустя 26 минут, 12 секунд (19.06.2010 - 17:50) gzim9x написал(а):
Цитата
я пару дней назад снял шаблонизатор с сайта и сам лично на свои сайты писать шаблонизаторы больше не буду. разница в скорости в 50-60 раз


продуманный кеш обычно решает проблемы со скоростью
для больших проектов отказываться от шаблонизаторов я бы не стал...

Спустя 4 минуты, 51 секунда (19.06.2010 - 17:55) gzim9x написал(а):
Gesandte
Вы с UTF работаете? mb_.... не забыли?

Спустя 8 минут, 41 секунда (19.06.2010 - 18:04) qpayct написал(а):
Цитата (gzim9x @ 19.06.2010 - 16:50)
продуманный кеш обычно решает проблемы со скоростью

я пока не понимаю, как и что именно имелось ввиду. есть ссыль?

Спустя 29 минут, 31 секунда (19.06.2010 - 18:33) Gesandte написал(а):
qpayct, в даннлом случае ничего перегружаться не будет) Я пишу достаточно простой шаблонизатор, и данный код будет задествоваться только один раз, подменяя все спец. теги на определнную инструкцию и создавая тем самым преобразованный файл.

gzim9x, да в utf-8 без BOM, но все (кроме данного участка работает корректно)
Даже если посмотреть этот код, то это

# Выделяем содержимое
$templater_tag[id] = substr($str, $this->templater_position[start], $this->templater_position[length]);


из верхнего куска все нормально режет, да и позиции с которых (до которых) режем строку определяются верно.

Я попробывал преобразовать данные функции, но результат тот же....
как и сказал в первом топике он начинает резать строку только если 0 сменить на другое число, но со сдвигом конечно.

Спустя 18 минут, 21 секунда (19.06.2010 - 18:51) gzim9x написал(а):
qpayct
Цитата
я пока не понимаю, как и что именно имелось ввиду. есть ссыль?

это больше из практики:
на любом сайте как правило есть блоки которые статичны и одинаковы для каждого юзера и блоки динамические, уникальные и для каждого разные.
Разделив таким образом сайт на такие блоки, вы сможете закешировать статичную инфу и использовать свой шаблонизатор лишь один раз при создании этого статичного блока.
Если же страница целиком получается статичной -- то юзеру вообще лучше отдавать 304 Not Modified (конечно сравнивая время из заголовка)-- тогда не будет задействован даже кеш.

Gesandte

пока substr некорректно работает с utf8, используйте mb_... функции
mb_substr($txt,$pos,1,"UTF-8")

http://www.php.net/manual/en/ref.mbstring.php

Спустя 53 минуты, 58 секунд (19.06.2010 - 19:45) Gesandte написал(а):
qpayct, я же говорю что уже пробывал эти модернизированные функции. Щас даже перекодировал в ANSI, толку то.....
Не в кодировке дело

Спустя 1 час, 22 минуты, 37 секунд (19.06.2010 - 21:08) gzim9x написал(а):
Gesandte

регулярки использовать религия не позволяет?


<?php

$txt="<$--template1--> какой-то текст <$--template2-->";

preg_match_all('/<\$--([^>]+)-->/',$txt,$match);

if (isset($match[1]))
foreach ($match[1] as $key=>$value) {

$txt=str_replace($match[0][$key],'тра-та-та',$txt); // заменить на свой обработчик

}

print $txt;
?>


а вообще использовать $ в теге шаблона -- весьма ответственный шаг wink.gif


Спустя 1 час, 21 минута, 20 секунд (19.06.2010 - 22:29) Gesandte написал(а):
простых путей не ищем))) надо мозг поубивать) вот и наткнулся на одну такую убивающую вещь, хех.

Цитата
а вообще использовать $ в теге шаблона -- весьма ответственный шаг

нет) как я сказал это простой шаблонизатор, пока заморачиваться, и делать что то типа smarty нет смыла)
сам файл шаблона будет использоваться один раз как я уже сказал, а скрипт шаблонизатора прогонит его и заменит все эти теги на переменные, функции(??) и тд. После чего запишет все в файл, который потом и будет подключаться при выводе контента.

Спустя 2 минуты, 48 секунд (19.06.2010 - 22:32) Gesandte написал(а):
gzim9x , спасибо за код, возможно таки его применю) ....но все же интересно с чем связан тот косяк)))

Спустя 3 часа, 43 минуты, 21 секунда (20.06.2010 - 02:15) gzim9x написал(а):
Цитата
....но все же интересно с чем связан тот косяк)))


после того как нашел в вашем коде...

foreach ($templater_file[f_initial] as $str) {
$templater->parse_tmpl($str);

fputs($templater_file[f_tmpl], $str);
}


то есть вы для каждой строчки запускаете заново свой шаблонизатор... unsure.gif
нет смысла обсуждать ошибки в вашем варианте -- это ОЧЕНЬ медленно!!!

Спустя 10 часов, 6 минут, 33 секунды (20.06.2010 - 12:22) Gesandte написал(а):
Цитата
нет смысла обсуждать ошибки в вашем варианте -- это ОЧЕНЬ медленно!!!


Уже реализовал на основе вашего примера wink.gif осталоь еще непосредственно подмену доработать и все))
Что касается скорости, мой первый вариант (весь код за исключением подмены, это -10 строк кода на данный момент примерно) выполняется в районе 0,0025 - 0, 003 секунды, на основе вашего кода время составляет порядка 0,002 - 0,0025 секунды. Ну допустим еще 0,0005 на те 10 строк и в итоге разница составит порядка 1 тысячной секунды, а для скрипта который будет запускаться один раз при смене дизайна.......ну думаю ясно)))

Спустя 25 минут, 48 секунд (20.06.2010 - 12:48) gzim9x написал(а):
Цитата
Что касается скорости, мой первый вариант (весь код за исключением подмены, это -10 строк кода на данный момент примерно) выполняется в районе 0,0025 - 0, 003 секунды, на основе вашего кода время составляет порядка 0,002 - 0,0025 секунды. Ну допустим еще 0,0005 на те 10 строк и в итоге разница составит порядка 1 тысячной секунды, а для скрипта который будет запускаться один раз при смене дизайна.......ну думаю ясно)))


не совсем понятно что вы измеряли -- потому как все же в основным временем будет парсинг, а погрешность в сотых и тысячных может плавать в зависимости от текущей загрузки процессора. Все же для сравнения нужны большие тексты -- на них и проявится то о чем я хотел сказать.
Удачи в программинге!

Спустя 8 минут, 1 секунда (20.06.2010 - 12:56) Gesandte написал(а):
Ну большие тесксты там не будут обрабатоваться, шаблон (html) главной страницы врядл и потянет более чем на 10 кбайт))

gzim9x, спасибо за помощь))

Спустя 3 часа, 22 минуты, 33 секунды (20.06.2010 - 16:18) qpayct написал(а):
gzim9x
мм. вот оно как. пока не сталкивался.

Gesandte
насчёт доработки держи, дорабатывай smile.gif
class templ
{
private $tr_found = 0;
private $replace;
public $result;

private $top;
private $down;
private $constructor;
private $center;
private $Panel;

function __construct($tplDir,$tplFile)
{
$this->tplDir = $tplDir;
$this->tplFile = $tplFile;
}
//_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
//

function set($value = NULL)
{
$this->replace[$this->tr_found] = $value;
$this->tr_found += 1;
}
//_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
//

function Set_Panel($i,$name)
{
$this->Panel[$name][$i] = 1;
}
//_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
//

function Construct($Panels=0)
{
$this->constructor = file_get_contents("tpl/".$this->tplDir.$this->tplFile.'.tpl');

preg_match_all('|(.+?){foreach}(.+?){/foreach}(.*)|s', $this->constructor, $cycles);
$this->top=$cycles[1][0];
$this->constructor=$cycles[2][0];
$this->down=$cycles[3][0];

$cycles = null;
preg_match_all('|({\$\d+})|s', $this->constructor, $cycles);
$count = count($cycles[0]);
for($a=0;$a<$this->tr_found;$a++)
{
$shab =$this->constructor;
for($i = 0; $i < $count; $i++)
$shab = str_replace("{\$". $i ."}", $this->replace[$a][$i] ,$shab);

$this->center .= $shab;
}
if($Panels == 1)
$this->center = $this->IF_FOUND($this->center);

$this->result = $this->top.$this->center.$this->down;
return $this->result;
}
//_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
//

function BuildTPL($Panels=0)
{
$this->constructor = file_get_contents("./tpl/".$this->tplDir.$this->tplFile.'.tpl');
if($Panels == 1)
$this->constructor = $this->IF_FOUND($this->constructor);

preg_match_all('|({\$\d+})|s', $this->constructor, $cycles);
$count = count($cycles[0]);
for($i = 0; $i < $count; $i++)
$this->constructor = str_replace("{\$". $i ."}", $this->replace[0][$i] ,$this->constructor);

$this->constructor = preg_replace("/(\{\\$[\d+]{1,}\})/", "" ,$this->constructor); // ??????? ??????
$this->result = $this->constructor;

return $this->result;
}
//_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
//

function IF_FOUND($tpl)
{
preg_match_all('|({PANEL ([A-z0-9]*)})(.+?)({/PANEL})(.+?)|si', $tpl, $cycles);
$count = count($cycles[0]);
$param;
for($i=0;$i<$count;$i++)
{
$param[$cycles[2][$i]] = (int)($param[$cycles[2][$i]]);
if(isset($this->Panel[$cycles[2][$i]][$param[$cycles[2][$i]]]))
$tpl = preg_replace('/\{PANEL '. $cycles[2][$i] .'\}(.+?)\{\/PANEL\}/is', " $1 ", $tpl,1);
else
$tpl = preg_replace('/\{PANEL '. $cycles[2][$i] .'\}(.+?)\{\/PANEL\}/is', "", $tpl,1);

$param[$cycles[2][$i]] += 1;
}
return($tpl);
}
function __destruct() {
unset($this->templ);
}
}
;


теперь смотри, допустим тебе надо впихнуть в шаблон парочку переменных из пхп делаешь так:

// тут прописуешь где лежит шаблон
$templator = new templ('/tpl/','register');
// тут прописуешь массив, который хочешь передать шаблону а в шаблоне, чтобы вывести допустим самый первый элемент массива пишешь {$0}
$obj = array($object1, object2, obj3.......);
$templator->set($obj);
return $templator->BuildTPL(1);


ну и сам шаблон для примера
<ul id="lang-menu">
<li
class="lang-li">{$0}
<ul id="in-lang">
{$1}
</ul>
</li>
</ul>

Спустя 6 часов, 30 минут, 49 секунд (20.06.2010 - 22:49) Gesandte написал(а):
qpayct, жестко ты его wink.gif
замутил от души шаблонизатор, хехе)) спасибо за код, может что подчерпну smile.gif

Спустя 2 часа, 1 минута, 58 секунд (21.06.2010 - 00:51) qpayct написал(а):
да ничего особенного на самом деле smile.gif просто тормозящяя сайт и разработку хрень, вот и всё, что требовалось доказать.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.