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

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

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

 

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

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

тема: найти конструкцию
 
 автор: admiral   (10.04.2011 в 04:10)   письмо автору
 
 

в строке есть конструкция вида {block="name_function"}
Нужно проверить, существует ли такая строка, если да, то нужно извлечь значение name_function

p.s. name_function может быть абсолютно разным

  Ответить  
 
 автор: Deed   (10.04.2011 в 12:20)   письмо автору
 
   для: admiral   (10.04.2011 в 04:10)
 


<?
$str
="Expressions. Key features include: 

* real time results: shows results as you type {block=\"name_function\"}
* code hinting: roll over your expression to see info on specific elements 
* detailed results: roll over a match to see details & view group info below 
* built in regex guide: double click entries to insert them into your expression"
;

preg_match("/(?<={block=\")(.+?)\"/s",$str,$out);

echo 
$out[1];

?>

  Ответить  
 
 автор: heed   (10.04.2011 в 17:40)   письмо автору
 
   для: Deed   (10.04.2011 в 12:20)
 

медленное выражение.
Выражения тем быстрее чем меньше возможно ложных срабатываний в самом начале выражения.
здесь "заглядывает назад" при каждом переходевперёд после неудачи совпадения каждого любого символа

незнаю как показать, например можно запустить такой bat-файл
    @echo off
    cd /d %~dp0
    setlocal
    set PATH=j:\usr\local\php;%PATH%
    php.exe -f "%0"
    endlocal
    goto ENDOFPHP

<?php
$HDTME 
0.0;

 function 
g_t($bool=false){ //время
    
global $HDTME;
    list(
$m$s) = sscanf(microtime(), '%f %u');
    if(
$bool) {
     
printf("<hr/>%.7f\n\n", (($m $s) - $HDTME));
     
flush();
    } 
$HDTME $m $s;
}
$str str_repeat('Expressions. Key features include:'300) .'  

* real time results: shows results as you type {block="name_function"} 
* code hinting: roll over your expression to see info on specific elements  
* detailed results: roll over a match to see details & view group info below  
* built in regex guide: double click entries to insert them into your expression'


g_t();
g_t();
preg_match('/{block="(.+?)"/',$str,$out);
 echo 
$out[1] ."\n";
g_t(1);
preg_match('/(?<={block=")(.+?)"/',$str,$out); 
 echo 
$out[1] ."\n";
g_t(1);
preg_match('/{block="(.+?)"/',$str,$out);  
echo 
$out[1] ."\n";
g_t(1);
preg_match('/(?<={block=")(.+?)"/',$str,$out);
echo 
$out[1] ."\n";
g_t(1);
preg_match('/{block="(.+?)"/',$str,$out); 
echo 
$out[1] ."\n";
g_t(1);

exit;
?>
    :ENDOFPHP
    echo.
    pause
Время выполнений не очень равномерное, но разницу в скорости выражений заметно
Думаю это не оптимизируется специально, чтобы не ограничивать возможности более хитрого использования (?<=)

  Ответить  
 
 автор: Deed   (10.04.2011 в 20:46)   письмо автору
 
   для: heed   (10.04.2011 в 17:40)
 

Спасибо, мистер heed! Каждый Ваш ответ на этом форуме открывает мне что-то новое и в php, и в регулярках. За что Вам большое спасибо!
И я, и cheops не раз просили выкладывать в качестве примеров затруднений реальные фрагменты проблемного кода. И вопрос, заданный здесь, не уточняет, сколько в строке фрагментов {} и сколько из них имеют в себе block=.
Поэтому и предложил я "хитрое" (?<=)
Согласитесь, предложи я /\{block=\"(.+?)\"\}/s, у меня самого осталось бы ощущение халтуры.

P.S.
Интересно, однако

--------------------------------------------------------------------------------
0.0095968 name_function
--------------------------------------------------------------------------------
0.0085690 name_function
--------------------------------------------------------------------------------
0.0004542 name_function
--------------------------------------------------------------------------------
0.0029688 name_function
--------------------------------------------------------------------------------
0.0003512 сек. - не знал даже, что это так существенно.

  Ответить  
 
 автор: .heed   (11.04.2011 в 02:06)
 
   для: Deed   (10.04.2011 в 20:46)
 

Ощущение халтуры полностью можно приглушить заменив сначала .+? на более быстрое [^"]*
потом переделать совсем , подумав о том что возможно должны встречаться заэкранированные кавычки, потом долго пробовать каким-же оно получится если кавычки могут быть двух и более типов. И потом, подумав что получилось как-то не очень компактное и совсем не быстрое выражение, появится ощущение невозможности нехалтуры :) И мысли про возможности усовершенствования существующего языка выражений путём добавления лексики :)

  Ответить  
 
 автор: Deed   (11.04.2011 в 08:19)   письмо автору
 
   для: .heed   (11.04.2011 в 02:06)
 

Но в таком случае можно забыть о супружеском долге, о мусорном ведре, о горе грязной посуды... Что чревато.

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

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