За последние 24 часа нас посетили 49128 программистов и 1758 роботов. Сейчас ищут 673 программиста ...

помогите разобрать регулярные выражения

Тема в разделе "Регулярные выражения", создана пользователем AlexALX, 5 мар 2008.

  1. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    Народ, нужна помащь.
    Есть HTML код:
    Код (Text):
    1.  
    2. <h1>Lincs:</h1>
    3. <br>
    4. {repeat:var0}
    5. {var0}linc0<br>
    6. {/repeat}
    С помащю регулярки бью его на составные:
    PHP:
    1. <?php
    2. $tp_open='{';
    3. $tp_close='}';
    4. preg_match_all("%$tp_open repeat\:(.*)$tp_close(.*)$tp_open/repeat$tp_close%Ui", $this->template[$file_id], $rep, PREG_SET_ORDER);
    5. ?>
    Получаю массив:
    Код (Text):
    1.  
    2. Array
    3. (
    4.     [0] => Array
    5.         (
    6.             [0] => { repeat:var0}{var0}linc0<br>{/repeat}
    7.             [1] => var0
    8.             [2] => {var0}linc0<br>
    9.         )
    10. }
    1. Можно ли избавиться от пробела перед repeat?
    2. Как дальше обработать блок, чтоб он считал значение переменной из массива?
     
  2. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    PHP:
    1. <?php
    2. $pattern    = "%{$tp_open}repeat\:(\w+){$tp_close}(.*){$tp_open}\\/repeat{$tp_close}%is";
    3. preg_match_all($pattern, $str, $rep, PREG_SET_ORDER);
    4.  
    а как Вы "считаете значения" переменных?
     
  3. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    Э... Пардон, не "считал" а "считывал" из переменной $vars...
    Чтоб при $vars= array("var0 ","var1 ","var2 "), он бы вывел:
    HTML:
    1.  
    2. <h1>Lincs:</h1>
    3. <br>
    4. var0 linc0<br>
    5. <br>
    6. var1 linc0<br>
    7. <br>
    8. var2 linc0<br>
    9.  
    И можно ли это сделать только с помощю регулярки?
     
  4. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Chaser
    Покажите, как Вы получаете значения переменных, что есть в linc0 и var0.

    PS> что var0 - массив, я уже понял, что вы хотите сделать итерацию, я тоже понял.
    не могу понять как работать с классом. Требуется выводить что-то на экран или просто сделать return
    Попробуйте еще раз, объяснить что Вам нужно.
     
  5. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    Есть класс шаблонизатора:
    PHP:
    1. <?php
    2. class template_class
    3. {
    4. var $tp_open="{";
    5. var $tp_close="}";
    6. var $vars = array();
    7. var $template = array();
    8.  
    9. function get_tpl($file_id, $tpl_name)
    10. {
    11.      if(empty($tpl_name) || !file_exists($tpl_name))
    12.         {
    13.             return false;
    14.         }
    15.         else
    16.         {
    17.             $this->template[$file_id] = file_get_contents($tpl_name);
    18.         }
    19. }
    20.  
    21. function set_tpl($file_id, $key, $var)
    22.     {
    23.         $this->vars[$file_id][$key] = $var;
    24.     }
    25.  
    26. function tpl_parse($file_id)
    27.     {
    28.     $tp_open=$this->tp_open;
    29.     $tp_close=$this->tp_close;
    30.         foreach($this->vars[$file_id] as $find => $replace)
    31.         {
    32.             switch(gettype($replace))
    33.             {
    34.                 case 'array': $this->template[$file_id] = preg_replace ("/$tp_open$find\[(\w+?)\]$tp_close/ie", '$replace[strtolower (\'\1\')]', $this->template[$file_id]); break;
    35.                 case 'string': $this->template[$file_id] = str_replace($tp_open.$find.$tp_close, $replace, $this->template[$file_id]); break;
    36.                 case 'integer': $this->template[$file_id] = str_replace($tp_open.$find.$tp_close, $replace, $this->template[$file_id]); break;
    37.             };
    38.         }
    39.         $this->tpl_blocks($file_id);
    40.     }
    41. }
    42. ?>
    43.  
    Нужно внедрить в него аналог функции foreach, чтоб при орбработки шаблона с кодом:
    HTML:
    1.  
    2. <h1>Lincs:</h1>
    3. <br>
    4. {repeat:var0}
    5. {var0}linc0<br>
    6. {/repeat}
    7.  
    Чтоб, при $vars= array("var0 ","var1 ","var2 "), он бы вывел:
    HTML:
    1.    
    2. <h1>Lincs:</h1>
    3. <br>
    4. var0 linc0<br>
    5. <br>
    6. var1 linc0<br>
    7. <br>
    8. var2 linc0<br>
    9.  
    И еще, что тут неверно:
    PHP:
    1.  
    2. <?php
    3. case 'boolean':
    4. {
    5. if($replace=true)
    6. {$this->template[$file_id] = preg_replace ("/$tp_open$find$tp_close(.*)$tp_open\/$find$tp_close/ie", "\1", $this->template[$file_id]);}
    7. else
    8. {$this->template[$file_id] = preg_replace ("/$tp_open$find$tp_close(.*)$tp_open\/$find$tp_close/ie", "", $this->template[$file_id]);}
    9. }
    10. break;
    11. ?>
    12.  
    При обработке строки:
    HTML:
    1. {admin}Vidit toka admin!{/admin}
    $admin=true
     
  6. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    PHP:
    1. <?php
    2.  
    3. $this->vars = array(
    4.     'var0'    => array('mix1', 'mix2', 'mix3')
    5. );
    6.  
    7. preg_match_all(..., $rep, ...);
    8.  
    9. $content = '';
    10. foreach ($this->vars[ $rep[1] ] as $mix)
    11. {
    12.     $content .= str_replace( $rep[1], $mix, $rep[2] );
    13. }
    14. var_dump($content);
    15.  
    16. ?>
     
  7. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    сравни
    PHP:
    1. <?
    2. if($replace==true)
    3. ?>
     
  8. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    2topas
    Подскажи плиз, как можно внедрить это в шаблонизатор =)
    2RomanBush:
    Заменил код на:
    PHP:
    1.  
    2. <?
    3. case 'boolean': $this->template[$file_id] = preg_replace_callback("%$tp_open$find$tp_close(.*)$tp_open\/$find$tp_close%Ui", create_function('$rep','global $replace;if($replace){$return $rep[1];}else{$return "";}'), $this->template[$file_id]); break;
    4. ?>
    5.  
    Но всеравно не рабтает...
     
  9. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
  10. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
  11. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    PHP:
    1.  
    2. <?
    3.   $this->vars = array(
    4.       'var0'    => array('mix1', 'mix2', 'mix3')
    5.   );
    6.  
    7.   preg_match_all(..., $rep, ...);
    8.  
    9.   $content = '';
    10.   foreach ($this->vars[ $rep[1] ] as $mix)
    11.   {
    12.       $content .= str_replace( $rep[1], $mix, $rep[2] );
    13.   }
    14.   var_dump($content);
    15. ?>
    16.  
    Насколько я понел, код работает со всем текстом. А если мне нужно обработать всеволш 1 блок в шаблоне?
    И еще нащет:
    PHP:
    1.  <?
    2.   case 'boolean': $this->template[$file_id] = preg_replace_callback("%$tp_open$find$tp_close(.*)$tp_open\/$find$tp_close%Ui", create_function('$rep','global $replace;if($replace){$return $rep[1];}else{$return "";}'), $this->template[$file_id]); break;
    3.   ?>
    ...
     
  12. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    мм?
     
  13. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    Ну что тут можно сказать... сглупил =)
    И еще ошибка где-то в самом выражении, а где - не могу понять.
     
  14. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
     
  15. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    Всеравно...
     
  16. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    выражение

    Приведите, пожалуйста пример, в котором это правило не срабатывает
     
  17. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    index.php
    PHP:
    1.  
    2. <?php
    3. require('template.class.php');
    4. $parse = new template_class;
    5. $parse->get_tpl('home','ht.htm');
    6. $parse->set_tpl('home','admin',true);
    7. $parse->tpl_parse('home');
    8. print $parse->template['home']
    9. ?>
    10.  
    template.class.php
    PHP:
    1.  
    2. <?php
    3. class template_class
    4. {
    5. var $tp_open="{";
    6. var $tp_close="}";
    7. var $vars = array();
    8. var $template = array();
    9.  
    10. function get_tpl($file_id, $tpl_name)
    11. {
    12.      if(empty($tpl_name) || !file_exists($tpl_name))
    13.         {
    14.             return false;
    15.         }
    16.         else
    17.         {
    18.             $this->template[$file_id] = file_get_contents($tpl_name);
    19.         }
    20. }
    21.  
    22. function set_tpl($file_id, $key, $var)
    23.     {
    24.         $this->vars[$file_id][$key] = $var;
    25.     }
    26.  
    27. function tpl_parse($file_id)
    28.     {
    29.     $tp_open=$this->tp_open;
    30.     $tp_close=$this->tp_close;
    31.         foreach($this->vars[$file_id] as $find => $replace)
    32.         {
    33.             switch(gettype($replace))
    34.             {
    35.                 case 'array': $this->template[$file_id] = preg_replace("/$tp_open$find\[(\w+?)\]$tp_close/ie", '$replace[strtolower (\'\1\')]', $this->template[$file_id]); break;
    36.                 case 'string': $this->template[$file_id] = str_replace($tp_open.$find.$tp_close, $replace, $this->template[$file_id]); break;
    37.                 case 'integer': $this->template[$file_id] = str_replace($tp_open.$find.$tp_close, $replace, $this->template[$file_id]); break;
    38.                 case 'boolean': $this->template[$file_id] = preg_replace_callback("%$tp_open$find$tp_close(.*)$tp_open\/$find$tp_close%Uis", create_function('$rep','global $replace; print_r($rep);if($replace){return $rep[1];}else{return "";}'), $this->template[$file_id]); break;
    39.             }
    40.             print gettype($replace)."<br>";
    41.         }
    42.     }
    43. }
    44. ?>
    45.  
    ht.htm
    HTML:
    1. {admin}Vidit toka admin!{/admin}<br>
     
  18. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    Исправил строчку на:
    PHP:
    1.  
    2. <?php
    3. case 'boolean': $this->template[$file_id] = preg_replace_callback("%$tp_open$find$tp_close(.*)$tp_open\/$find$tp_close%Uis", create_function('$rep',"if($replace){return \$rep[1];}else{return '';};"), $this->template[$file_id]); break;
    4.  ?>
    5.  
    При true все нормально выводит. При false выводит ошибки:
    Перепроверил все по 5 раз, немагу найти ошибку...
     
  19. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    Изменил
    PHP:
    1.  
    2. <?php
    3. case 'boolean': $this->template[$file_id] = preg_replace_callback("%$tp_open$find$tp_close(.*)$tp_open\/$find$tp_close%Uis", create_function('$rep',"if($replace){return \$rep[1];}else{return '';};"), $this->template[$file_id]); break;
    4. ?>
    5.  
    на
    PHP:
    1.  
    2. <?php
    3. case 'boolean':
    4.                     {
    5.                     if($replace)
    6.                         {
    7.                             $this->template[$file_id] = preg_replace("%$tp_open$find$tp_close(.*)$tp_open\/$find$tp_close%Uis", '\1', $this->template[$file_id]);
    8.                         }
    9.                         else
    10.                         {
    11.                             $this->template[$file_id] = preg_replace("%$tp_open$find$tp_close(.*)$tp_open\/$find$tp_close%Uis", '', $this->template[$file_id]);
    12.                         }
    13.                     break;
    14. ?>
    15.  
    Ошибки исчезли, но почиму 1 ариант не работает, подскажите?
     
  20. Receptor

    Receptor Активный пользователь

    С нами с:
    29 дек 2008
    Сообщения:
    1
    Симпатии:
    0
    хотел сделать проверку для email`а, но получается ошибка:
    Warning: eregi() [function.eregi]: REG_ERANGE in C:\Program Files\Apache Group\Apache2\htdocs\processfeedback.php on line 14

    14 line:
    PHP:
    1. if (!eregi('^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$',$email))
    пожалуйста, помогите разобраться.
     
  21. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0