|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: 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)
| | на результат поиска не влияет, влияет на то как выражение будет скомпилировано
, там и было сначала просто (?:) , но я решил что не помешает , к тому-же два (?: подряд тоже не очень
А так я и не сказал-бы что моё выражение безупречное, но делал как для себя :) | |
|
|
|
|
|
|
|
для: 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 такого пока нет кажется | |
|
|
|
|
|
|
|
для: 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 ));
| если я правильно понял условия | |
|
|
|
|
|
|
|
для: heed
(16.02.2010 в 21:48)
| | 1. Проветрить существуетс ли срока - упс ))
на php! | |
|
|
|
|
|
|
|
для: freeing
(16.02.2010 в 12:44)
| | Это где? всмысле в htaccess или на php хотите сделать
Под строкой запроса имеется ввиду query_string или вообще request_uri ?
//
upd прочитал подпункты вопроса ,)
>1. Проветрить существуетс ли срока
Зто где? :)) | |
|
|
|
|