Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Регулярка...

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
armancho7777777 Супермодератор
Отправлено: 09 Октября, 2012 - 13:34:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Всем привет!

Сразу к делу:

к примеру, есть такой шаблон:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <? defined('DEF') or die(); ?>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  7. <title>Документ без названия</title>
  8. </head>
  9.  
  10. <body>
  11.   <table width="100%" border="1">
  12.     <tr>
  13.       <td><?=sub_component("param1", "param2")?></td>
  14.     </tr>
  15.     <tr>
  16.       <td><?=component\sub_component('param', "param2", 222, array('key' => 'value')?></td>
  17.       <td><?=component22()->sub_component22()?></td>
  18.     </tr>
  19.     <tr>
  20.       <td><?php echo component::sub_component( "param3",  55 ) ; ?></td>
  21.     </tr>
  22.   </table>
  23. </body>
  24. </html>
  25.  


Надо регуляркой получить:
CODE (text):
скопировать код в буфер обмена
  1.  
  2.     [methods] => Array
  3.         (
  4.             [0] => sub_component
  5.             [1] => component\sub_component
  6.             [2] => component::sub_component
  7.         )
  8.     [args] => Array
  9.         (
  10.             [0] => "param1", "param2"
  11.             [1] => "param3", '222', array('my-host' => $_SERVER['HTTP_HOST'])
  12.             [2] =>  "param3",  55
  13.         )
  14.  

Но выходит:
CODE (text):
скопировать код в буфер обмена
  1.  
  2.     [methods] => Array
  3.         (
  4.             [0] => defined
  5.             [1] => sub_component
  6.             [2] => component\sub_component
  7.             [3] => component22
  8.             [4] => component::sub_component
  9.         )
  10.     [args] => Array
  11.         (
  12.             [0] => 'DEF') or die(
  13.             [1] => "param1", "param2"
  14.             [2] => "param3", '222', array('my-host' => $_SERVER['HTTP_HOST'])
  15.             [3] => )->sub_component22(
  16.             [4] =>  "param3",  55
  17.         )
  18.  

Т.е. надо пропустить:


А component22()->sub_component22() получить отдельно.

Сама регулярка:
PHP:
скопировать код в буфер обмена
  1.  
  2. $str = file_get_contents('test_tpl.php');
  3.  
  4. $pattern = '~'.
  5.            '<\?[=|php|echo|\s]*'.
  6.            '(?P<methods>[\w:\\\]+)'.
  7.            '\((?P<args>.*)\)'.
  8.            '[;|\s]*\?>'.
  9.            '~siU';
  10.                    
  11. preg_match_all($pattern, $str, $match);
  12.  

(Отредактировано автором: 10 Октября, 2012 - 05:24:52)

 
 Top
armancho7777777 Супермодератор
Отправлено: 10 Октября, 2012 - 08:24:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Задача решена.
Пришлось сделать ход конём, но так даже лучше, убил сразу двух зайцев:
сразу и подстановка будет осуществляться ходом.

PHP:
скопировать код в буфер обмена
  1.  
  2. function render($val, $type = 'method')
  3. {
  4.         /**
  5.         *
  6.         *  Здесь уже разбираем строку $val на состовляющие,
  7.         *  вызываем соответствующие объекты, методы, свойства (константы)
  8.         *  и возвращаем результат вывода для последующей подстановки
  9.         *
  10.         */
  11.        
  12.         if($type == 'object')
  13.         return 'object: <pre>'.print_r($val, 1).'</pre>';
  14.         else
  15.         return $type.': '.$val;
  16. }
  17.  
  18.  
  19. function objectRender($file_name)
  20. {
  21.         $str = php_strip_whitespace($file_name);
  22.  
  23.         $pattern = '~'.
  24.                    '(<\?php[\s]+echo|<\?[\s]+echo|<\?=|<\?php[\s]+|<\?)[\s]*'.
  25.                    '(?P<data>.*?)'.
  26.                    '[;|\s]*\?>'.
  27.                    '~si';
  28.                            
  29.         $str = preg_replace_callback($pattern, function($matches){
  30.                        
  31.                         $val = trim($matches['data']);
  32.  
  33.  
  34.                         // Объект()->метод()
  35.                         if(strstr($val, '->'))
  36.                         {
  37.                                 list($obj, $method) = explode('->', $val);
  38.                                
  39.                                 $data = array(
  40.                                         'object' => $obj,
  41.                                         'method' => $method
  42.                                         );
  43.                                                
  44.                                 return render($data, 'object');
  45.                         }
  46.                        
  47.                         // Мусор
  48.                         else if(preg_match('~(\)[\w\s]+\()|(defined)~', $val) || $val == '')
  49.                         return;
  50.                        
  51.                         // Свойства и константы
  52.                         else if(!preg_match('~\(.*\)$~U', $val))
  53.                         return render($val, 'var');
  54.                        
  55.                         // Методы
  56.                         else
  57.                         return render($val);
  58.                
  59.                
  60.         }, $str);
  61.        
  62.         return trim($str);
  63. }
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. echo objectRender('test_tpl.php');
  71.  
  72.  

(Отредактировано автором: 12 Октября, 2012 - 18:32:22)

 
 Top
armancho7777777 Супермодератор
Отправлено: 10 Октября, 2012 - 16:39:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




.

(Отредактировано автором: 10 Октября, 2012 - 16:41:00)

 
 Top
pspvolt
Отправлено: 10 Октября, 2012 - 17:21:10
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




armancho7777777 Извиняюсь что влез в эту тему! Так как не могу отправить PM сообщение тебе armancho7777777... не мог бы помочь с tfile http://forum.php.su/topic.php?fo...pic=3386&p=2 ? Заранее благодарен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB