Собственн для движка пытаюсь нахимичить шаблонизатор.
Конкретно пользовательская функция в которой и применяется 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 и впарвду косяк непонятный...
щас тогда весь код выложу, иначе опять работа встанет...
test.html
По поводу моего ооп особо не упоминайте,сам знаю что в нем особо ничего не смыслю)))
щас тогда весь код выложу, иначе опять работа встанет...
<?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_.... не забыли?
Вы с 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, но все (кроме данного участка работает корректно)
Даже если посмотреть этот код, то это
из верхнего куска все нормально режет, да и позиции с которых (до которых) режем строку определяются верно.
Я попробывал преобразовать данные функции, но результат тот же....
как и сказал в первом топике он начинает резать строку только если 0 сменить на другое число, но со сдвигом конечно.
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;
?>
а вообще использовать $ в теге шаблона -- весьма ответственный шаг
Спустя 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);
}
то есть вы для каждой строчки запускаете заново свой шаблонизатор...
нет смысла обсуждать ошибки в вашем варианте -- это ОЧЕНЬ медленно!!!
Спустя 10 часов, 6 минут, 33 секунды (20.06.2010 - 12:22) Gesandte написал(а):
Цитата |
нет смысла обсуждать ошибки в вашем варианте -- это ОЧЕНЬ медленно!!! |
Уже реализовал на основе вашего примера осталоь еще непосредственно подмену доработать и все))
Что касается скорости, мой первый вариант (весь код за исключением подмены, это -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, спасибо за помощь))
gzim9x, спасибо за помощь))
Спустя 3 часа, 22 минуты, 33 секунды (20.06.2010 - 16:18) qpayct написал(а):
gzim9x
мм. вот оно как. пока не сталкивался.
Gesandte
насчёт доработки держи, дорабатывай
теперь смотри, допустим тебе надо впихнуть в шаблон парочку переменных из пхп делаешь так:
ну и сам шаблон для примера
мм. вот оно как. пока не сталкивался.
Gesandte
насчёт доработки держи, дорабатывай
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, жестко ты его
замутил от души шаблонизатор, хехе)) спасибо за код, может что подчерпну
замутил от души шаблонизатор, хехе)) спасибо за код, может что подчерпну
Спустя 2 часа, 1 минута, 58 секунд (21.06.2010 - 00:51) qpayct написал(а):
да ничего особенного на самом деле просто тормозящяя сайт и разработку хрень, вот и всё, что требовалось доказать.