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

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

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Строка запроса

Сообщения:  [1-10]   [11-11] 

 
 автор: heed   (18.02.2010 в 02:41)   письмо автору
 
   для: big-trot   (18.02.2010 в 00:33)
 

разбраться в деталях на php мне обычно помогали просто сравнения замеров времени

, попробовал сейчас поразбираться из коммандной строки с выражениями в perl, и понял что ничего не понял
много незнакомых букв, отказывается компилировать (?<=\.js|\.htm) ,) но есть что-то интересное

пробовал чего попросще
#<?
use re qw(Debug All);
$txt '.7z';
$txt =~ m@^(?>[0-9]+|\.(?!\.))++$@;

, но всёравно много букв :) повырезал с того момента где только-что осуществился захват двух символов



Matching REx "^(?:[0-9]+|\.(?!\.))+$" against ".7z"
......................
   2 <.7> <z>                | 27:            WHILEM[1/1](0)
                                              whilem: matched 2 out of 1..32767
   2 <.7> <z>                |  4:              BRANCH(17)
   2 <.7> <z>                |  5:                PLUS(27)
                                                  ANYOF[0-9] can match 0 times o
ut of 2147483647...
                                                  failed...
   2 <.7> <z>                | 17:              BRANCH(26)
   2 <.7> <z>                | 18:                EXACT <.>(20)
                                                  failed...
                                                BRANCH failed...
                                              whilem: failed, trying continuatio
n...
   2 <.7> <z>                | 28:              NOTHING(29)
   2 <.7> <z>                | 29:              EOL(30)
                                                failed...
                                              failed...
                                            failed...
   1 <.> <7z>                | 17:        BRANCH(26)
   1 <.> <7z>                | 18:          EXACT <.>(20)
                                            failed...
                                          BRANCH failed...
                                        whilem: failed, trying continuation...
   1 <.> <7z>                | 28:        NOTHING(29)
   1 <.> <7z>                | 29:        EOL(30)
                                          failed...
                                        failed...
                                      BRANCH failed...
                                    failed...
                                  failed...
Match failed
Freeing REx: "^(?:[0-9]+|\.(?!\.))+$"



Matching REx "^(?>[0-9]+|\.(?!\.))+$" against ".7z"
 ............

   2 <.7> <z>                | 28:            SUCCEED(0)
                                              subpattern success...
   2 <.7> <z>                | 30:      WHILEM[1/1](0)
                                        whilem: matched 2 out of 1..32767
   2 <.7> <z>                |  4:        SUSPEND(30)
   2 <.7> <z>                |  6:          BRANCH(19)
   2 <.7> <z>                |  7:            PLUS(28)
                                              ANYOF[0-9] can match 0 times out o
f 2147483647...
                                              failed...
   2 <.7> <z>                | 19:          BRANCH(28)
   2 <.7> <z>                | 20:            EXACT <.>(22)
                                              failed...
                                            BRANCH failed...
                                          failed...
                                        whilem: failed, trying continuation...
   2 <.7> <z>                | 31:        NOTHING(32)
   2 <.7> <z>                | 32:        EOL(33)
                                          failed...
                                        failed...
                                      whilem: failed, trying continuation...
   1 <.> <7z>                | 31:      NOTHING(32)
   1 <.> <7z>                | 32:      EOL(33)
                                        failed...
                                      failed...
                                    failed...
                                  failed...
Match failed
Freeing REx: "^(?>[0-9]+|\.(?!\.))+$"



Matching REx "^(?>[0-9]+|\.(?!\.))++$" against ".7z"
............
   2 <.7> <z>                | 30:              SUCCEED(0)
                                                subpattern success...
   2 <.7> <z>                | 32:        WHILEM[1/1](0)
                                          whilem: matched 2 out of 1..32767
   2 <.7> <z>                |  6:          SUSPEND(32)
   2 <.7> <z>                |  8:            BRANCH(21)
   2 <.7> <z>                |  9:              PLUS(30)
                                                ANYOF[0-9] can match 0 times out
 of 2147483647...
                                                failed...
   2 <.7> <z>                | 21:            BRANCH(30)
   2 <.7> <z>                | 22:              EXACT <.>(24)
                                                failed...
                                              BRANCH failed...
                                            failed...
                                          whilem: failed, trying continuation...

   2 <.7> <z>                | 33:          NOTHING(34)
   2 <.7> <z>                | 34:          SUCCEED(0)
                                            subpattern success...
   2 <.7> <z>                | 36:EOL(37)
                                  failed...
Match failed
Freeing REx: "^(?>[0-9]+|\.(?!\.))++$"



я так понял что даже (?>) не так эффективно как могло-бы быть
, возможно я даже ошибался что в том случае будет лучше (?>) , чем (?:)
, но на скорость нужно тестить на php

  Ответить  
 
 автор: Тень&   (18.02.2010 в 01:24)   письмо автору
 
   для: big-trot   (18.02.2010 в 00:33)
 

Так ты же вроде бы сторонник принципа "работает -- и ладно"?

  Ответить  
 
 автор: big-trot   (18.02.2010 в 00:33)   письмо автору
 
   для: .heed   (18.02.2010 в 00:15)
 

Я просто пытаюсь разобраться в деталях.

  Ответить  
 
 автор: .heed   (18.02.2010 в 00:15)
 
   для: big-trot   (17.02.2010 в 23:47)
 

на результат поиска не влияет, влияет на то как выражение будет скомпилировано
, там и было сначала просто (?:) , но я решил что не помешает , к тому-же два (?: подряд тоже не очень
А так я и не сказал-бы что моё выражение безупречное, но делал как для себя :)

  Ответить  
 
 автор: big-trot   (17.02.2010 в 23:47)   письмо автору
 
   для: heed   (17.02.2010 в 23:31)
 

В данном случае, если я не ошибаюсь, атомарная группировка никак не влияет на эффективность поиска. Может есть смысл ее убрать, чтобы упростить саму запись выражения.

  Ответить  
 
 автор: heed   (17.02.2010 в 23:31)   письмо автору
 
   для: big-trot   (17.02.2010 в 22:11)
 

всмысле такая (?>) ?:))
Для сокращения колличества сохранённых состояний , как я понял и если можно так сказать

.+\s захватит весь текст а потом будет отступать к предидущим состояниям пока не наткнётся на пробел
(?>.+) просто идёт вперёд и не сохраняеткакие-то промежуточные состояния. и поиск следующего символа не будет проводится в пройденной строке


В перл начиная к 5.10 (кажется) ещё массу такого что ускоряет работу выражений ввели ,
например \K это то что можно записать как (?<=1)2 теперь 1\K2 и немного улучшено
(ретроспективная проверка нулевой длинны называлось , вроде:))

By default, when a quantified subpattern does not allow the rest of the overall pattern to match, Perl will backtrack. However, this behaviour is sometimes undesirable. Thus Perl provides the "possessive" quantifier form as well.
*+ Match 0 or more times and give nothing back
++ Match 1 or more times and give nothing back
?+ Match 0 or 1 time and give nothing back
{n}+ Match exactly n times and give nothing back (redundant)
{n,}+ Match at least n times and give nothing back
{n,m}+ Match at least n but not more than m times and give nothing back


раньше было вроде только [...]++
много чего интересного, жалко только что легче придумывать новые выражения чем пробовать улучшить старые :)

но в pcre такого пока нет кажется

  Ответить  
 
 автор: big-trot   (17.02.2010 в 22:11)   письмо автору
 
   для: heed   (17.02.2010 в 12:48)
 

Можете объяснить, зачем используется атомарная группировка?

  Ответить  
 
 автор: heed   (17.02.2010 в 12:48)   письмо автору
 
   для: freeing   (17.02.2010 в 07:00)
 

я не понял что назвали словом "недопустимость".
Если допустим ничего из hostname проверять не нужно, в адресах как-бы обязательно должно указываться имя файла
,и всё нужно проверить одним выражением
, то просще проверять на соответситвие ожидаемому формату , чем искать несоответствия
, что-то вроде
<pre><?php
$txt 
= array('http://...../..js',
'http://...../',
'http://...../1.js'#здесь массив адресов
);

$reg '#^http://[^/]+
(?>/(?:[0-9A-Za-z]+|\.(?!\.))+)+
(?<=\.js|\.htm|\.html)$#x'
;

print_r(preg_grep$reg$txt ));
если я правильно понял условия

  Ответить  
 
 автор: freeing   (17.02.2010 в 07:00)   письмо автору
 
   для: heed   (16.02.2010 в 21:48)
 

1. Проветрить существуетс ли срока - упс ))

на php!

  Ответить  
 
 автор: heed   (16.02.2010 в 21:48)   письмо автору
 
   для: freeing   (16.02.2010 в 12:44)
 

Это где? всмысле в htaccess или на php хотите сделать
Под строкой запроса имеется ввиду query_string или вообще request_uri ?

//
upd прочитал подпункты вопроса ,)

>1. Проветрить существуетс ли срока

Зто где? :))

  Ответить  

Сообщения:  [1-10]   [11-11] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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