[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регулярки в шаблонизаторе
haZe
Добрый день! Пишу шаблонизатор, и вот дошло дело почти до конца и я сдулся.
С регулярками работал очень мало, были соображения, как сделать без них, но они не качественные.

Собственно начал с конструкции иф.
Приходит строка например вида:
if $a == $b
да да, она вот такая голая, также вместо переменной могут быть всякие конструкции, которые преобразуются:
Код
from  to
$a     $this->vars['a']
$a.b  $this->vars['a']['b']
6       6
"text" "text"
'text'  'text'



также вместо == может быть !=, >=... и остальные
И вся это хрень может повторятся через || или &&

Господа, направьте пожалуйста!!!



Спустя 24 минуты (15.10.2009 - 23:46) kirik написал(а):
Забавные все таки люди существа smile.gif Выдумывают себе всякие сложности.

Ну да ладно smile.gif
Цитата (haZe @ 15.10.2009 - 15:22)
также вместо переменной могут быть всякие конструкции, которые преобразуются

Эти конструкции преобразуются уже другой частью шаблонизатора, или должны парситься этой же регуляркой?

Цитата (haZe @ 15.10.2009 - 15:22)
И вся это хрень может повторятся через || или &&

Я так понимаю что скобочки тоже могут присутствовать?
PHP
if ($a == $b) || ($a == 666)

Спустя 10 минут, 34 секунды (15.10.2009 - 23:56) haZe написал(а):
Цитата
Забавные все таки люди существа  Выдумывают себе всякие сложности.
Ага... ниче не поделаешь...
Цитата
Эти конструкции преобразуются уже другой частью шаблонизатора, или должны парситься этой же регуляркой?

Думаю можно разломать на несколько итераций
Цитата
Я так понимаю что скобочки тоже могут присутствовать?

Сомневаюсь, ну максимум в конструкции что-то вроде:
if ($a >$b || $a < $c) && $g == 6
Но врятли, у меня таких ифов никогда в шаблоне не было

Спустя 8 минут, 36 секунд (16.10.2009 - 00:05) kirik написал(а):
Цитата (haZe @ 15.10.2009 - 15:56)
if ($a >$b || $a < $c) && $g == 6

Тобишь из такой штуки в php нужно будет получить что-то типа:
PHP
if(($this->vars['a'] > $this->vars['b'] || $this->vars['a'] < $this->vars['c']) && $this->vars['g'] == 6)

верно?

Спустя 5 минут, 10 секунд (16.10.2009 - 00:10) haZe написал(а):
Да, круто, ты можешь мне подсказать, как это сделать?

Спустя 3 минуты, 47 секунд (16.10.2009 - 00:14) kirik написал(а):
Цитата (haZe @ 15.10.2009 - 16:10)
Да, круто, ты можешь мне подсказать, как это сделать?

Да сам еще толком не знаю smile.gif

А как у тебя определяется что этот кусок будет являться куском логики в шаблонизаторе?

Спустя 18 минут, 35 секунд (16.10.2009 - 00:33) haZe написал(а):
ну там длинная цепочка explode-в.
Сначала делится на обрабатываем\не обрабатываемые части.
Потом обрабатываемые делятся на текст и тэги. и вот дошел до разбора тегов, с else, /if и пр. проблем нет, а вот if....
И все теги обрамлены в {}

Спустя 11 минут, 1 секунда (16.10.2009 - 00:44) kirik написал(а):
Значит что..
if нужно заменить на if(, в конец строки добавить ).
Внутреннюю часть разобрать так: если "слово" начинается на $, потом числобуквенные символы без пробелов или символ "." (точка), и это "слово" не стоит в кавычках, значит это переменная (ее будем разбирать как переменную - убирать из начала $, explode'ить по "."(точкам), и заменять на значения из массива $this->vars).
Логические знаки и символы у нас остаются неизменными (==, !=, ||, &&, ....). Ровно как неизменными остаются все скобочки и строки (набор символов в апострофах или кавычках).

Итого у нас получилось 2 действия:
1. Доставляем к if'у скобочки (в начало и в конец)
2. Работаем с переменными

Первое действие провернуть не сложно, второе тоже не очень smile.gif
Если не решишь, подмогну.

ЗЫ. подскажу лишь, что чтобы начать вытаскивать переменные, нужно сначала убрать все строки (набор символов, заключенных в кавчки/апостофы, при этом не забудь про экранированные символы внутри строк).

Спустя 1 день, 21 час, 37 минут, 31 секунда (17.10.2009 - 22:21) haZe написал(а):
Сори, пропал, тут личная жизнь забурлила)

Первое действи делается действительно просто, можно выявить епрвое вхождение строки, если оно равно 0 или 1, то просто отрезаем первые 2 или 3 символа. Ну и всю эту конструкцию обрамляем if( и )

Перед обрамлением можно всю конструкцию разделить на массив, через... если память не изменяет eregi, по символам сравнения и логики. Ну в общем если встречается == или || или !=.
И получится, что каждая переменная лежит в отдельной ячейке массива, если первым символом идет $ то это переменная, если " или ', то текст, если ни то ни то, то число.ну и тут ничего не надо менять кроме первого варианта.
Но, но я не знаю что делать со скобками. Ну в этой ситуации:
if ($a >$b || $a < $c) && $g == 6

Спустя 1 час, 37 секунд (17.10.2009 - 23:22) kirik написал(а):
Цитата (haZe @ 17.10.2009 - 14:21)
Перед обрамлением можно всю конструкцию разделить на массив, через... если память не изменяет eregi, по символам сравнения и логики.

Нафига?
Цитата (haZe @ 17.10.2009 - 14:21)
Но, но я не знаю что делать со скобками.

Зачем с ними что-то делать?


Дзержи код
PHP
$str '
if ($a >$b || $a < \'soto\\\'na666\') && $g.f.0 == 6 && $ff == "$asot\"ona"
here we go!
'
;

$strings = array();

function 
replaceStrings($str)
{
    global 
$strings;
    
$id '#string_'.uniqid(md5(rand()), true).'#';
    
$strings[$id] = ($str{0} == '\\') ? stripslashes($str) : $str;
    return 
$id;
}

// Parse IF statement
$str preg_replace('/if\s*(.*)$/im''if(\\1)'$str);

// Replace strings with ID's
$str preg_replace('/((["\'])(\\\\\\2|[^\\2])+\\2)/ieU'"replaceStrings('\\1')"$str);

// Parse vars
$str preg_replace('/\$([a-z0-9\.]+)/ie''"\\\\$this->vars[\'".str_replace(".", "\'][\'", "\\1")."\']"'$str);

// Replace ID's with strings back
$str strtr($str$strings);

echo 
$str;

Спустя 1 день, 15 часов, 52 минуты, 38 секунд (19.10.2009 - 15:14) haZe написал(а):
Даа.. Круто, резко понял, что я полный дуб в логике и в PHP по сравнению с тобой.
Я все это разобрал, погляди пожалуйста, правильно ли я все понял и объясни что не понял.

Свернутый текст
PHP
function replaceStrings($str)
{
//Просто возвращает, очень уникальную рандомную захэшрованную строку
//И еще что-то делает с str, кладя его в глобальный массив strings, но что я не понял.
    global $strings;
    $id = '#string_'.uniqid(md5(rand()), true).'#';
    $strings[$id] = ($str{0} == '\\') ? stripslashes($str) : $str;// ? : не понятно, вроде если стр будет NULL, то... эээ... 
    return $id;
}


// Parse IF statement
$str = preg_replace('/if\s*(.*)$/im', 'if(\\1)', $str);
// /это начало шаблона if-текст \s любой проблельный символ, (.*)-паттерн, любой символ любое количество раз, /конец шаблона i-модификатор любойго решшистра, m-модификатор ну в общем цела стррока должно быть это.
//Потом просто паттерн обрамляем ифом и скобками

// Replace strings with ID's
$str = preg_replace('/((["\'])(\\\\\\2|[^\\2])+\\2)/ieU', "replaceStrings('\\1')", $str);
//Многа слэшэй. /начало ( первый паттерн, в нем второй в нем встречается или " или ') третий паттенрн два экранированных слэша(зачем?) сслыка на сторой паттерн 0_о.
//или сслыка на второй паттерн в начале, закончили паттерн второй) второй паттен встречается 1 или более раз, и опятьвторой паттерн. Не понял работу модификатора U. 
//В общей сложности, я так понял создается паттерн с кавычками и постоянно используется для проверки и экранирования имеющихся внутри него кавычек, но механизм я недопонял.

// Parse vars
$str = preg_replace('/\$([a-z0-9\.]+)/ie', '"\\\\$this->vars[\'".str_replace(".", "\'][\'", "\\1")."\']"', $str);
//Ну здесь все понятно, замением знак доллра после которого идет паттерн в котором могут быть опред. символы 1 и более раз, без учета регистра. модификатор e тоже не ясен. И через ссылку вставляем в нужный текст.

// Replace ID's with strings back
$str = strtr($str, $strings);
//Это тоже связано со встором preg_replace, но как я опять же недопонял.

Спустя 1 час, 36 секунд (19.10.2009 - 16:15) haZe написал(а):
А, кажись понял, модификатор U, выполняет после обработки второй аргумент функции как код?

Спустя 1 час, 11 минут, 2 секунды (19.10.2009 - 17:26) kirik написал(а):
Цитата (haZe @ 19.10.2009 - 08:15)
А, кажись понял, модификатор U, выполняет после обработки второй аргумент функции как код?

Нет, модификатор "e" это делает. Пруфлинк

Спустя 3 часа, 32 минуты, 47 секунд (19.10.2009 - 20:59) kirik написал(а):
haZe
На самом деле наверняка как-то проще можно сделать, это первое что пришло в голову.
лови
PHP
function replaceStrings($str)
{
    
// Объявляем переменную $strings глобальной
    
global $strings;
    
// Генерим уникальный ID
    
$id '#string_'.uniqid(md5(rand()), true).'#';
    
// Если первый символ в принимаемой строке "\" (обратный слэш), значит эта строка экранирована preg_replace'ом
    
if($str{0} == '\\')
    {
        
$strings[$id] = stripslashes($str); // убираем экранирование и записываем эту строчку в глобальный массив с ключем ввиде уникального ID
    
}
    
// если строка не была экранирована
    
else
    {
        
$strings[$id] = $str// просто записываем ее в массив
    
}

    
// и возвращаем сгенеренный ID
    
return $id;
}


$str preg_replace('/if\s*(.*)$/im''if(\\1)'$str);
// /это начало шаблона if-текст \s любой проблельный символ, (.*)-паттерн, любой символ любое количество раз, /конец шаблона i-модификатор любойго решшистра, m-модификатор ну в общем цела стррока должно быть это.
//Потом просто паттерн обрамляем ифом и скобками
/// [АГА, ТОЛЬКО M - ЭТО MULTILINE (ВРОДЕ), ЧТО ГОВОРИТ РЕГУЛЯРКАМ, ЧТО СТРОКА МОЖЕТ БЫТЬ МНОГОСТРОЧНОЙ (ВО КАК!)]


$str preg_replace('/((["\'])(\\\\\\2|[^\\2])+\\2)/ieU'"replaceStrings('\\1')"$str);
//Многа слэшэй. /начало ( первый паттерн, в нем второй в нем встречается или " или ') третий паттенрн два экранированных слэша(зачем?) [ПОТОМУ ЧТО \\2 - ССЫЛКА НА ВТРОЙ ПАТТЕРН, А \\\\ - ЭКРАНИРОВАННЫЙ ОБРАТНЫЙ СЛЭШ. НУЖНО ДЛЯ ТОГО, ЧТОБЫ ПАРСИТЬ СТРОКИ С ЭКРАНИРОВАННЫМИ КАВЫЧКАМИ ТИПА 'fuck\'n']
//или сслыка на второй паттерн в начале, закончили паттерн второй) второй паттен встречается 1 или более раз, и опятьвторой паттерн.
//В общей сложности, я так понял создается паттерн с кавычками и постоянно используется для проверки и экранирования имеющихся внутри него кавычек, но механизм я недопонял. [МОДИФИКАТОР U УБИРАЕТ ЖАДНОСТЬ ПАРСЕРА, ТОЕСТЬ ЕСЛИ ЕГО УБРАТЬ, ТО ПАТТЕРНУ БУДЕТ СООТВЕТСВОВАТЬ ВСЯ СТРОКА ОТ ПЕРВОЙ " ДО ПОСЛЕДНЕЙ " (ПРИ ЭТОМ НЕ ВАЖНО СКОЛЬКО ИХ ВНУРИ, И КАКИЕ ОНИ)]
/// [ЭТОЙ РЕГУЛЯРКОЙ МЫ ДОСТАЕМ (А ТОЧНЕЕ ЗАМЕНЯЕМ НА ID) ВСЕ СТРОКИ, ЗАКЛЮЧЕННЫЕ В КАВЫЧКИ/АПОСТОФЫ, И КОТОРЫЕ МОГУТ ИМЕТЬ ЭКРАНИРОВАННЫЕ КАВЫЧКИ/АПОСТОФЫ ВНУТРИ СЕБЯ]


$str preg_replace('/\$([a-z0-9\.]+)/ie''"\\\\$this->vars[\'".str_replace(".", "\'][\'", "\\1")."\']"'$str);
//Ну здесь все понятно, замением знак доллра после которого идет паттерн в котором могут быть опред. символы 1 и более раз, без учета регистра. модификатор e тоже не ясен. И через ссылку вставляем в нужный текст.

// Replace ID's with strings back
$str strtr($str$strings);
//Это тоже связано со встором preg_replace, но как я опять же недопонял.
/// [ТУТ МЫ ЗАМЕНЯЕМ ОБРАТНО ID НА СТРОКИ, КОТОРЫЕ ХРАНЯТСЯ В МАССИВЕ $strings]

Надеюсь разберешься smile.gif

Спустя 4 часа, 23 минуты, 46 секунд (20.10.2009 - 01:22) haZe написал(а):
Да, вроде все понял. Спасибо тебе огромное!!! Помог мне в логике, реализации и обучении. Про схему ? : я вообще не знал. Но еще один вопрос остался, что означают фигурные скобки в $str{0} я перелопатил мануалы, массвы и много другое, но так и не нашел что это означает. Только в строках нашел такой вывод переменных.

Спустя 21 минута, 58 секунд (20.10.2009 - 01:44) kirik написал(а):
Цитата (haZe @ 19.10.2009 - 17:22)
Про схему ? : я вообще не знал.
Цитата (haZe @ 19.10.2009 - 17:22)
Но еще один вопрос остался, что означают фигурные скобки в $str{0} я перелопатил мануалы, массвы и много другое, но так и не нашел что это означает.

String access and modification by character
Можно было написать и $str[0] но я привык юзать фигурные скобки в строках smile.gif

Спустя 5 часов, 36 минут, 7 секунд (20.10.2009 - 07:21) glock18 написал(а):
Цитата
но я привык юзать фигурные скобки в строках


пора отвыкать smile.gif я в свое время тоже привык, а в 5.3 версии эта фича устаревшая. решили там сделать доступ только как к массиву. фактически строка == массив символов, так что мне лично это интуитивно понятней.

Спустя 11 часов, 8 минут, 14 секунд (20.10.2009 - 18:29) kirik написал(а):
Цитата (glock18 @ 19.10.2009 - 23:21)
так что мне лично это интуитивно понятней

Ну эт потому что ты на c++ писал smile.gif Я вообще не подрубал в сипипишные массивы после пхп rolleyes.gif

Спустя 1 час, 41 минута, 48 секунд (20.10.2009 - 20:11) haZe написал(а):
kirik, я нашел ошибку. В итоге если мы сравниваем что-то со строкой которая в двойных кавычках (" <- таких), то они на выходе экранированы.
Для фикса надо удалить двойную кавычку в регулярке:

...g_replace('/((["\'])(\\\\\\2|[^\\2]...

Спустя 16 минут, 29 секунд (20.10.2009 - 20:27) glock18 написал(а):
kirik
да, после пхпшных массивов вернуться к сишным будет тяжело... но суть то та же у строк и массивов smile.gif

массив чисел:
0|1|2|3|4|5|10|43|84|19|-3

строка:
All these things I hate
A|l|l| |t|h|e|s|e| |t|h|i|n|g|s| |I| |h|a|t|e

не забывайте, что символ это число от 0 до 255 (если брать однобайтные кодировки). По сути эта же строка переводится в массив соответствующих чисел (ASCII коды)

так что единственное различие массива от строки - то что размер элемента строки один байт для однобайтных строк и два для мультибайтных. Так что фактически двухбайтный символ == unsigned small int в mysql (2 байтное число).

Спустя 2 минуты, 1 секунда (20.10.2009 - 20:29) kirik написал(а):
haZe
эй.. какую ошибку? Не нужно кавычку удалять, ибо строки которые заключены в кавычки не будут попадать под паттерн.
Ты про какую экранированность говоришь ("они на выходе экранированы")? Про то что в функцию replaceStrings() передаются экранированные апострофы? Так они и должны, ибо строка, передаваемая в функцию заключена в апострофы: preg_replace('...', "replaceStrings('\\1')", $str);

Спустя 15 минут, 34 секунды (20.10.2009 - 20:45) haZe написал(а):
ммм. Смотри, если я возвращаю как было, т.е. пишу кавычку назад.

При:
{if $b.s == 'joker'}
Получаю:
<? if($this->vars['b']['s'] == 'joker') ?>

При:
{if $b.s == "joker"}
Получаю:
<? if($this->vars['b']['s'] == \"joker\") ?>

Если кавычку убрать, то все в норме, дажеесли внутри есть экранированая кавычка.

Спустя 41 минута, 53 секунды (20.10.2009 - 21:27) kirik написал(а):
haZe
У меня все нормально, без всяких экранирований..
Ща прикреплю код, мож че-нить не так скопировалось..
UPD посмотри

Спустя 1 час, 17 минут, 22 секунды (20.10.2009 - 22:44) haZe написал(а):
Странно. Твой код, самостоятельно работает правильно. Но если его воткнуть в ООП среду, то происходит такая фигня. Я все регулярки внимательно сравнил и вообще все стравнил.
Может потому? погляди пожалуйста.

Свернутый текст
PHP
var $strings = array();
    function 
getIf($string)
        {

            
// Parse IF statement
            
$str preg_replace('/if\s*(.*)$/im''if(\\1)'$str);
            
// Replace strings with ID's
            
$str preg_replace('/((["\'])(\\\\\\2|[^\\2])+\\2)/ieU'"$this->replaceStrings('\\1')"$str);
            
// Parse vars
            
$str preg_replace('/\$([a-z0-9\.]+)/ie''"\\\\$this->vars[\'".str_replace(".", "\'][\'", "\\1")."\']"'$str);

            
// Replace ID's with strings back
            
$str strtr($str$this->strings);
            return 
"<? ".$str." ?>";

    }
    
    function 
replaceStrings($str)
    {
    
//    global $this->strings;
        
$id '#string_'.uniqid(md5(rand()), true).'#';
        
$strings[$id] = ($str{0} == '\\') ? stripslashes($str) : $str;
        return 
$id;
    }

Спустя 9 минут, 10 секунд (20.10.2009 - 22:53) glock18 написал(а):
Цитата
Но если его воткнуть в ООП среду, то происходит такая фигня

"ООП среда" вообще очень страшная штука smile.gif

я думаю, что это связано с тем, что "ООП среда" не понимает, что $str и $string одно и то же smile.gif

Спустя 3 минуты, 10 секунд (20.10.2009 - 22:56) kirik написал(а):
Ээм.. мож я чего не догоняю, но:
1. getIf($string), в то время как ты юзаешь $str внутри.
2. где глобальные $strings в обоих функциях?
2. почему в первой функции ты нормально обращаешься к $strings в классе, а во второй нет?
3. Проверь, наверняка в getIf() кавычки уже приходят экранированные, и это наверняка из-за той регулярки, которая вытаскивает код из скобочек ({}), если там регулярка конечно..

Спустя 1 минута, 33 секунды (20.10.2009 - 22:58) haZe написал(а):
не, там просто кусок я вырезал там есть $str = $string; Иначе оноб ваще не работало biggrin.gif

Спустя 7 минут, 39 секунд (20.10.2009 - 23:05) haZe написал(а):
Виноват. Странно, второй пункт правильный был. Видать гдето с Ctrl+Z перебрал.
Если честно то вот так все сейчас:
Свернутый текст
PHP
var $strings = array();
    function getIf($string)
    {
        if($string == "else") return "<? else: ?>";
        if($string == "/if") return "<? endif; ?>";
        if(strstr($string, "if") == $string)
        {
            // Parse IF statement
            $string = preg_replace('/if\s*(.*)$/im', 'if(\\1)', $string);
            // Replace strings with ID's
            $string = preg_replace('/((["\'])(\\\\\\2|[^\\2])+\\2)/ieU', "$this->replaceStrings('\\1')", $string);
            // Parse vars
            $string = preg_replace('/\$([a-z0-9\.]+)/ie', '"\\\\$this->vars[\'".str_replace(".", "\'][\'", "\\1")."\']"', $string);

            // Replace ID's with strings back
            $string = strtr($string, $this->strings);
            return "<? ".$string." ?>";
        }
    }
    
    function replaceStrings
($str)
    {
    //    global $this->strings;
        $id = '#string_'.uniqid(md5(rand()), true).'#';
        $this->strings[$id] = ($str{0} == '\\') ? stripslashes($str) : $str;
        return $id;
    }


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

Спустя 13 минут, 52 секунды (20.10.2009 - 23:19) kirik написал(а):
haZe
А по 3-му пункту чего скажешь?

Спустя 13 минут, 58 секунд (20.10.2009 - 23:33) haZe написал(а):
Там не регулярка, там вот такая функция:
Свернутый текст
PHP
function getAll($string)
    {
        
$mass explode("{"$string);
            foreach(
$mass as $a)
            {
                if(
strstr($a"}") != FALSE)
                {
                    
$b explode("}"$a);
                    
$c[] = array($b[0], "tag");
                    
$c[] = array($b[1], "normal");
                }else{
                    
$c[] = array($a"normal");
                }
            }
        return 
$c;
    }

Она ломает текст на тэги и кладет их в массив маркируя, где что.

Потом полученный массив я прогоняю через такую:
Свернутый текст
PHP
function removeTags($mass)
    {
        
$b "";
        foreach (
$mass as $a)
        {
            
            if(
$a[1] == "tag"){
                if((
$b .= $this->getIf($a[0])) != "") continue;
                if((
$b .= $this->getForeach($a[0])) != "") continue;
                if((
$b .= $this->getStr($a[0])) != "") continue;
                
$b .= $a[0];
            }else{
                
$b .= $a[0];    
            }
            
        }
        return 
$b;
    }

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

Она по умолчанию не может вернуть это с экранированными кавычками, тем более где-то в середине.

Спустя 6 минут, 33 секунды (20.10.2009 - 23:40) kirik написал(а):
haZe
ясно.. я бы парсил все это дело регулярками, один фиг сгенерированные шаблоны кэшируются (должны кэшироваться, иначе прока от них не будет).
А вообще можешь весь класс шаблонизатора кинуть (с примером)?

Спустя 5 минут, 20 секунд (20.10.2009 - 23:45) haZe написал(а):
Да, конечно, каждый раз выполнятся будут генерированные шаблоны и генерироватся они будут только когда редактируешь сами шаблоны.
Класс прикладываю файлом, там много не доделано, так сказать рабочая версия.

Ну и чтоб не качать он же в спойлере.

Свернутый текст
PHP
<?php

class templater 
{

    private static $instance = null;
    // singleton access
    public static function getInstance()
    {
        if (self::$instance === null)
        {
            self::$instance = new self();
        }
        return self::$instance;
    }

    private $vars;
    private $templates = "style/original/templates/";
    private $templates_c = "style/original/templates_c/";
    function display($template)
    {
        if(!file_exists($this->templates . $template)) die('Шаблон <i>' . $template . '</i> не найден');
        $text = file_get_contents($this->templates . $template);
        
        $text 
= $this->getLiteral($text);


        foreach($text as $a){
            if($a[1] != "literal"){
                $c = $this->getAll($a[0]);
                
                foreach
($c as $d){ $b[] = $d;};

            }
            else $b[] = $a;
        }
        
        $b 
= $this->removeTags($b);
        //echo $b;
        $disc = fopen($this->templates_c . $template, "a");
        fwrite($disc, $b."\n".fileatime($this->templates . $template)." - ".fileatime($this->templates_c . $template)."\n");
        fclose($disc);
//        print_r($b);
    }
    
    function getLiteral
($string)
    {
        $mass = explode("{literal}", $string);
                            
            foreach
($mass as $a)
            {
                if(strstr($a, "{/literal}") != FALSE)
                {
                    $b = explode("{/literal}", $a);
                    $c[] = array($b[0], "literal");
                    if($b[1] != "") $c[] = array($b[1], "normal");
                }else{
                    $c[] = array($a, "normal");
                }
            }
        return $c;
    }
    
    
    function getAll
($string)
    {
        $mass = explode("{", $string);
            foreach($mass as $a)
            {
                if(strstr($a, "}") != FALSE)
                {
                    $b = explode("}", $a);
                    $c[] = array($b[0], "tag");
                    $c[] = array($b[1], "normal");
                }else{
                    $c[] = array($a, "normal");
                }
            }
        return $c;
    }
    
    function removeTags
($mass)
    {
        $b = "";
        foreach ($mass as $a)
        {
            
            if
($a[1] == "tag"){
                if(($b .= $this->getIf($a[0])) != "") continue;
                if(($b .= $this->getForeach($a[0])) != "") continue;
                if(($b .= $this->getStr($a[0])) != "") continue;
                $b .= $a[0];
            }else{
                $b .= $a[0];    
            
}
            
        
}
        return $b;
    }
    
    var $strings 
= array();
    function getIf($string)
    {
        echo $string;
        if($string == "else") return "<? else: ?>";
        if($string == "/if") return "<? endif; ?>";
        if(strstr($string, "if") == $string)
        {
            // Parse IF statement
            $string = preg_replace('/if\s*(.*)$/im', 'if(\\1)', $string);
            // Replace strings with ID's
            $string = preg_replace('/(([\'])(\\\\\\2|[^\\2])+\\2)/ieU', "$this->replaceStrings('\\1')", $string);
            // Parse vars
            $string = preg_replace('/\$([a-z0-9\.]+)/ie', '"\\\\$this->vars[\'".str_replace(".", "\'][\'", "\\1")."\']"', $string);

            // Replace ID's with strings back
            $string = strtr($string, $this->strings);
            return "<? ".$string." ?>";
        }
    }
    
    function replaceStrings
($str)
    {
    //    global $this->strings;
        $id = '#string_'.uniqid(md5(rand()), true).'#';
        $this->strings[$id] = ($str{0} == '\\') ? stripslashes($str) : $str;
        return $id;
    }
    
    function getForeach
(){}
    function getStr(){}
    
    function assign
($name, $value)
    {
        $this->vars[$name] = $value;
    }
    

    
}


Хммм... не дает архив прикрепить, грит "Вы не можете загружать такой тип файлов"

Спустя 2 минуты, 59 секунд (20.10.2009 - 23:48) kirik написал(а):
Цитата (haZe @ 20.10.2009 - 15:45)
Хммм... не дает архив прикрепить, грит "Вы не можете загружать такой тип файлов"

Угу.. .rar заливается нормально.


Хм.. а чего у тебя echo $b; выводит, если расскоментить? У меня просто все ок с кавычками (взял код из твоего поста)..
Код
<? if($this->vars['b']['s'] == 'joker') ?>
Получаю:


При:
<? if($this->vars['b']['s'] == "joker") ?>

Спустя 14 минут, 53 секунды (21.10.2009 - 00:03) haZe написал(а):
Конечно! Потому что там этой самой кавычки нет! Обрати внимание! smile.gif
$string = preg_replace('/(([\'])(\\\\\\2|[^\\2])+\\2)/ieU', "$this->replaceStrings('\\1')", $string);


Цитата
я бы парсил все это дело регулярками

Ну как бы, использую средства которыми владею и которыми проще. Я эти функции написал за 15 минут, а с регулярками я бы еще много времени потратил бы. Тем более обычные строковые функции работают быстрее чем регулярки.

Спустя 6 минут, 39 секунд (21.10.2009 - 00:10) kirik написал(а):
Удивительная хрень...
Попробуй вывести echo '\\'; в любом из методов класса (точнее в getIf() методе), и потом выведи это вообще вне класса..

фак, эт я туплю..
Кароч у тебя там ошибка в коде..
PHP
preg_replace('...'"$this->replaceStrings('\\1')"$string);

тут надо знак бакса или экранировать или всю строку в апострофы заключать.

Ты меня с ума сводишь smile.gif

Спустя 7 минут, 22 секунды (21.10.2009 - 00:17) haZe написал(а):
эээ.... Воткнул echo '\\'; в getIf результат нулевой. 0_о
Потом воткнул тоже самое вне класса, отобразился слэш.

Спустя 1 минута, 13 секунд (21.10.2009 - 00:18) kirik написал(а):
ап smile.gif

Спустя 15 секунд (21.10.2009 - 00:19) haZe написал(а):
Цитата
тут надо знак бакса или экранировать или всю строку в апострофы заключать.

Ты меня с ума сводишь 


Мухаха! И в правду!!! Блин, слов нет!
Быстрый ответ:

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