Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: пропарсить некоторые фрагменты
 
 автор: m@rchello   (17.02.2010 в 15:05)   письмо автору
 
 

добрый день

Подскажите пожалуста как мне из HTML кода пропарсить такие вещи

<div>
{if var}
что то ...
{default var}
другой текст
{/if}

</div>

на месте var может быть любой текст(латинские буквы, цифры, знак подчёркивания)

теоретически мне нужно получить массив вида
$arr['type'] = 'if';
$arr['var'] = 'var';
$arr['true'] = 'что то ...';
$arr['false'] = 'другой текст';

НО может быть так что не будет {default var}
тоесть так

<div>
{if var}
что то ...
{/if}

</div>

тогда массив будет такой
$arr['type'] = 'if';
$arr['var'] = 'var';
$arr['true'] = 'что то ...';
$arr['false'] = '';

вообщем то пишу свой парсер ... и нужно минимум функций, приходица велосипед делать ....
смарти и тд слишком объёмные.
может кто делал такое и подскажет как реализовать ... или покажет свой вариант с такой же процедурой. но в вашем представлении?

  Ответить  
 
 автор: heed   (17.02.2010 в 16:10)   письмо автору
 
   для: m@rchello   (17.02.2010 в 15:05)
 

с массивом наверное лишние операции будут получаться
как-то с preg_replace_callback() слегка вроде удобнее, примерно как-то так
<pre><?php
$txt 
'+++++<div>+++++
{if var} 
что то ... 
{default var} 
другой текст 
{/if}
+++++</div><div>+++++ 
{if var2} 
что то 2... 
{/if}
</div>'
;

function 
obr($m){
    
print_r($m);
?><hr><?
    
if(isset($m[4])) 
    return (
$m[1])? $m[2] :(($m[3]) ? $m[4]: '');
    else
    return (
$m[1])? $m[2] :'';
}
$reg '@{if\s+(.*?)\s*}
((?>[^{]*|(?!{/if|{default).)*) # то что до {/if или {default
(?:{default\s*(.*?)\s*}
    ((?>[^{]*|(?!{/if).)*)        # то что до {/if 
)?
{/if\s*}
@xs'
;
echo 
preg_replace_callback($reg'obr'$txt);

но для проверок этих var наверное какое-нибудь ещё и eval() придётся использовать, хотя слабо себе представляю какие бывают шаблонизаторы

и иногда удобнее просто прогонять весь текст выражением попросче , а уже в такой-же функции анализировать чего на самом деле происходит
Или похоже можно сделать (кажется будет ещё на чуть медленнее) с preg_split()

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования