"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64
отвал говоришь?
А если нужны цифры только от 3 до 5 и во входящих данных - мусор?
Код:if (preg_match ("/^[\D]*/([3-5]{1}).*$/",$_GET['id'],$id) ){ include($id[1].".htm"); } else { include("1.htm"); }
---------- Добавлено в 19:24 ---------- Предыдущее сообщение было написано в 19:21 ----------
скорее всего 0.htm вряд ли стоит учитывать.
Код:if (preg_match ("/^[\D]*/([1-9][0-9]?).*$/",$_GET['id'],$id) ){ include($id[1].".htm"); } else { include("1.htm"); }
"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64
И тогда функция вернёт истину на любой набор символов хоть с одной цифрой (если я не ошибаюсь)
Вот за то и не люблю регулярные, что можно написать такого, что сам потом не разберёшь.
Но, конечно, это только отмазка, чтобы мозг не ломать "китайской грамотой".
Если знать их хорошо и функции которые с ними работают, то инструмент мощнейший.
Или я ничего не понимаю, или встретив одну цифру в subject, эта функция вернёт не 0, т.е. истину.int preg_match (string pattern, string subject [, array matches [, int flags]])
Ищет в subject совпадения с регулярным выражением, заданным в pattern.
Если matches предоставлен, он заполняется результатами поиска. $matches[0] будет содержать текст, совпавший со всем патэрном, $matches[1] будет содержать текст, совпавший первым захваченным субпатэрном в скобках, и так далее.
Т.е., можно и такую маску задать, но тогда нужно менять условия или инклюдить уже не переменную, а результаты функции (которые ещё выбрать нужно правильно).
Т.е., кроме самого регулярника нужно ещё учитывать что же оно реально делает в функции.
мне функция preg_match не нравится , имхо для таких целей лучше preg_match_all использовать , она не остановится после первого нахождения.
мне больше по душе htmlspecialchars(preg_replace("/[^1-9]/"),"",$id)
В общем , надо память освежить - пошел читать http://php.net/
![]()
Отнесу к последнему выражению.
идёт начало строки, затем мусор (любое количество не-цифр), если затем встречается цифра от 1 до 9 то хорошо, а если после неё будет цифра от 0 до 9 -0 то ещё лучше(не будет второй цифры - фиг с ней, она не обязательна) - запомним эти цифры (потому что в скобках), а всё остальное - остаток строки до конца совпадёт с сочетанием .*(любое количество любых символов), но мы запомним первые попавшиеся цифры, и возьмём их из $id[1] (потому что в $id[0] будет всё что совпало с шаблоном, а в $id[1] - только то, что совпало в первых скобках)
таким образом мы вытащим из строки с мусором число от 1 до 99.
"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64
Всё правильно, но, согласись, что это всёже не /[0-9]/, подставленное в первый пример.
А ошибки при использовании регулярных выражений вылазят довольно часто даже у профессионалов.
Я только говорю о том, что когда определён конечный словарь того, что может быть в запросе, часто проще и надёжнее запрос проверить в лоб.
Всё, что в $_GET генерируется самим кодом. Если это не бескончная случайная последовательность символов (не может быть любым), то всё что содержит мусор или проще говоря не совпадает с ограниченным числом возможных значений можно просто послать нафиг.
Это и в парсерах логов порой лучше работает, чем регулярное выражение в 14 этажей.
Кстати, спасибо за наводку на книжку - уже читаю.![]()
У нас простейший пример - 2 цифры. В конце концов вполне сойдёт (\d\d?)
Поскольку я - сисадмин, значит профессиональный параноик. Поэтому входной контроль данных - не считаю лишним. Мало ли кто чего пошлёт. Код или не код сгенерировал запрос - я то откуда знаю?
вот - пример - проверка на похожесть ldap rdn с одновременным разбиенем на массив:
а уж про парсинг пчелайновских счетов я вообще молчу(номера, длительность, цена)Код:preg_match_all ("/([^=,]+=[^=,]+),?/",$person,$target)
Джеффри обещал, что книга будет читаться как роман. Не соврал.
"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64
"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64