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

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

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

 

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

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

тема: Строка запроса
 
 автор: freeing   (16.02.2010 в 12:44)   письмо автору
 
 

Здравствуйте!

мне необходимо проверить строку запроса на недопустимость

1. Проветрить существуетс ли срока
2. Проверить есть ли в строке недопустимые символы (*%$££...) - один и более
3. Проверить есть ли в строке повторяющийся символы (.) два и более
4. Проветрить заканчивается ли строка на (js, css, htm..)

как это организовать выражениями, известно что конечный результат это ссылки вида:

http://www.bla.com/page1/page8/page1.html

мне необходимо заблокировать все возможные варианты ошибок и вывести ошибку в скручае неверного запроса

известно что строка запроса будет содержать только буквы, цифры и заканчиватсь .html

как мне блокировать все остальное?

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

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

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

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

Зто где? :))

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

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

на php!

  Ответить  
 
 автор: 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 ));
если я правильно понял условия

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

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

  Ответить  
 
 автор: 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 в 23:47)   письмо автору
 
   для: heed   (17.02.2010 в 23:31)
 

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

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

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

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

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

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

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

  Ответить  
 
 автор: 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

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

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