|
|
|
| в строке есть конструкция вида {block="name_function"}
Нужно проверить, существует ли такая строка, если да, то нужно извлечь значение name_function
p.s. name_function может быть абсолютно разным | |
|
|
|
|
|
|
|
для: 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];
?>
|
| |
|
|
|
|
|
|
|
для: 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
| Время выполнений не очень равномерное, но разницу в скорости выражений заметно
Думаю это не оптимизируется специально, чтобы не ограничивать возможности более хитрого использования (?<=) | |
|
|
|
|
|
|
|
для: 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)
| | Ощущение халтуры полностью можно приглушить заменив сначала .+? на более быстрое [^"]*
потом переделать совсем , подумав о том что возможно должны встречаться заэкранированные кавычки, потом долго пробовать каким-же оно получится если кавычки могут быть двух и более типов. И потом, подумав что получилось как-то не очень компактное и совсем не быстрое выражение, появится ощущение невозможности нехалтуры :) И мысли про возможности усовершенствования существующего языка выражений путём добавления лексики :) | |
|
|
|
|
|
|
|
для: .heed
(11.04.2011 в 02:06)
| | Но в таком случае можно забыть о супружеском долге, о мусорном ведре, о горе грязной посуды... Что чревато. | |
|
|
|