|
|
|
| Здравствуйте!
мне необходимо проверить строку запроса на недопустимость
1. Проветрить существуетс ли срока
2. Проверить есть ли в строке недопустимые символы (*%$££...) - один и более
3. Проверить есть ли в строке повторяющийся символы (.) два и более
4. Проветрить заканчивается ли строка на (js, css, htm..)
как это организовать выражениями, известно что конечный результат это ссылки вида:
http://www.bla.com/page1/page8/page1.html
мне необходимо заблокировать все возможные варианты ошибок и вывести ошибку в скручае неверного запроса
известно что строка запроса будет содержать только буквы, цифры и заканчиватсь .html
как мне блокировать все остальное? | |
|
|
|
|
|
|
|
для: freeing
(16.02.2010 в 12:44)
| | Это где? всмысле в htaccess или на php хотите сделать
Под строкой запроса имеется ввиду query_string или вообще request_uri ?
//
upd прочитал подпункты вопроса ,)
>1. Проветрить существуетс ли срока
Зто где? :)) | |
|
|
|
|
|
|
|
для: heed
(16.02.2010 в 21:48)
| | 1. Проветрить существуетс ли срока - упс ))
на php! | |
|
|
|
|
|
|
|
для: 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
(17.02.2010 в 12:48)
| | Можете объяснить, зачем используется атомарная группировка? | |
|
|
|
|
|
|
|
для: 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 в 23:31)
| | В данном случае, если я не ошибаюсь, атомарная группировка никак не влияет на эффективность поиска. Может есть смысл ее убрать, чтобы упростить саму запись выражения. | |
|
|
|
|
автор: .heed (18.02.2010 в 00:15) |
|
|
для: big-trot
(17.02.2010 в 23:47)
| | на результат поиска не влияет, влияет на то как выражение будет скомпилировано
, там и было сначала просто (?:) , но я решил что не помешает , к тому-же два (?: подряд тоже не очень
А так я и не сказал-бы что моё выражение безупречное, но делал как для себя :) | |
|
|
|
|
|
|
|
для: .heed
(18.02.2010 в 00:15)
| | Я просто пытаюсь разобраться в деталях. | |
|
|
|
|
|
|
|
для: big-trot
(18.02.2010 в 00:33)
| | Так ты же вроде бы сторонник принципа "работает -- и ладно"? | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|