???
Математика на уровне МГУ

Показано с 1 по 25 из 54

Тема: PHP-вопрос

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Мастер Аватар для DogEater
    Регистрация
    03.11.2001
    Адрес
    Подмосковье
    Возраст
    52
    Сообщений
    4,442

    Ответ: PHP-вопрос

    Цитата Сообщение от Mirnyi Посмотреть сообщение

    Я-то по-ламерски. Регулярники для меня - тёмный лес
    Значение набора символов /^\d$/ у меня в голове не помещается
    Сразу после начала строки идёт одна цифра, далее следует конец строки.
    Это гарантированная проверка на то, что в переменной только один символ и это есть цифра. После чего уже можно спокойно инклюдить.
    "Прежде чем открыть огонь - оглянись!"
    А.В. Ворожейкин "Сильнее смерти", стр 9.
    "<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
    Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
    © DEDA
    1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64

  2. #2
    Инспектор
    Регистрация
    12.08.2008
    Адрес
    Новосибирск
    Сообщений
    5,345

    Ответ: PHP-вопрос

    Цитата Сообщение от DogEater Посмотреть сообщение
    Это гарантированная проверка на то, что в переменной только один символ и это есть цифра.

    отвалбашки

  3. #3
    Мастер Аватар для DogEater
    Регистрация
    03.11.2001
    Адрес
    Подмосковье
    Возраст
    52
    Сообщений
    4,442

    Ответ: PHP-вопрос

    Цитата Сообщение от Mirnyi Посмотреть сообщение

    отвалбашки
    отвал говоришь?
    А если нужны цифры только от 3 до 5 и во входящих данных - мусор?
    Код:
    if (preg_match ("/^[\D]*/([3-5]{1}).*$/",$_GET['id'],$id) ){
       include($id[1].".htm");
    }
    else {
       include("1.htm");
    }


    ---------- Добавлено в 19:24 ---------- Предыдущее сообщение было написано в 19:21 ----------

    Цитата Сообщение от harinalex Посмотреть сообщение
    тогда уж надо предусмотреть и 99.htm (вряд ли там так мало файлов ) . имхо , лучше просто /[0-9]/
    скорее всего 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

  4. #4
    Инспектор
    Регистрация
    12.08.2008
    Адрес
    Новосибирск
    Сообщений
    5,345

    Ответ: PHP-вопрос

    Цитата Сообщение от DogEater Посмотреть сообщение
    отвал говоришь?
    А если нужны цифры только от 3 до 5 и во входящих данных - мусор?
    Да нет, я же не против
    Даже наоборот - за.

  5. #5
    Старший инструктор Аватар для harinalex
    Регистрация
    22.12.2007
    Адрес
    UUEE
    Возраст
    60
    Сообщений
    4,236

    Ответ: PHP-вопрос

    Цитата Сообщение от DogEater Посмотреть сообщение
    скорее всего 0.htm вряд ли стоит учитывать.
    Код:
    if (preg_match ("/^[\D]*/([1-9][0-9]?).*$/",$_GET['id'],$id) ){
       include($id[1].".htm");
    }
    else {
       include("1.htm");
    }
    в 0.htm можно какую-нибудь обидную фразу написАть

    главное , что инъекцию не даст сделать - и ладно .

  6. #6
    Старший инструктор Аватар для harinalex
    Регистрация
    22.12.2007
    Адрес
    UUEE
    Возраст
    60
    Сообщений
    4,236

    Ответ: PHP-вопрос

    Цитата Сообщение от DogEater Посмотреть сообщение
    Сразу после начала строки идёт одна цифра, далее следует конец строки.
    Это гарантированная проверка на то, что в переменной только один символ и это есть цифра. После чего уже можно спокойно инклюдить.
    тогда уж надо предусмотреть и 99.htm (вряд ли там так мало файлов ) . имхо , лучше просто /[0-9]/ или /^[\d]+/
    Крайний раз редактировалось harinalex; 19.03.2010 в 19:25.

  7. #7
    Инспектор
    Регистрация
    12.08.2008
    Адрес
    Новосибирск
    Сообщений
    5,345

    Ответ: PHP-вопрос

    Цитата Сообщение от harinalex Посмотреть сообщение
    тогда уж надо предусмотреть и 99.htm (вряд ли там так мало файлов ) . имхо , лучше просто /[0-9]/
    И тогда функция вернёт истину на любой набор символов хоть с одной цифрой (если я не ошибаюсь)
    Вот за то и не люблю регулярные, что можно написать такого, что сам потом не разберёшь.
    Но, конечно, это только отмазка, чтобы мозг не ломать "китайской грамотой".
    Если знать их хорошо и функции которые с ними работают, то инструмент мощнейший.

  8. #8
    Старший инструктор Аватар для harinalex
    Регистрация
    22.12.2007
    Адрес
    UUEE
    Возраст
    60
    Сообщений
    4,236

    Ответ: PHP-вопрос

    Цитата Сообщение от Mirnyi Посмотреть сообщение
    И тогда функция вернёт истину на любой набор символов хоть с одной цифрой (если я не ошибаюсь)
    Вот за то и не люблю регулярные, что можно написать такого, что сам потом не разберёшь.
    Но, конечно, это только отмазка, чтобы мозг не ломать "китайской грамотой".
    Если знать их хорошо и функции которые с ними работают, то инструмент мощнейший.
    нет , только этот диапазон цифр

  9. #9
    Инспектор
    Регистрация
    12.08.2008
    Адрес
    Новосибирск
    Сообщений
    5,345

    Ответ: PHP-вопрос

    Цитата Сообщение от harinalex Посмотреть сообщение
    нет , только этот диапазон цифр
    int preg_match (string pattern, string subject [, array matches [, int flags]])

    Ищет в subject совпадения с регулярным выражением, заданным в pattern.

    Если matches предоставлен, он заполняется результатами поиска. $matches[0] будет содержать текст, совпавший со всем патэрном, $matches[1] будет содержать текст, совпавший первым захваченным субпатэрном в скобках, и так далее.
    Или я ничего не понимаю, или встретив одну цифру в subject, эта функция вернёт не 0, т.е. истину.
    Т.е., можно и такую маску задать, но тогда нужно менять условия или инклюдить уже не переменную, а результаты функции (которые ещё выбрать нужно правильно).
    Т.е., кроме самого регулярника нужно ещё учитывать что же оно реально делает в функции.

  10. #10
    Старший инструктор Аватар для harinalex
    Регистрация
    22.12.2007
    Адрес
    UUEE
    Возраст
    60
    Сообщений
    4,236

    Ответ: PHP-вопрос

    Цитата Сообщение от Mirnyi Посмотреть сообщение
    Или я ничего не понимаю, или встретив одну цифру в subject, эта функция вернёт не 0, т.е. истину.
    Т.е., можно и такую маску задать, но тогда нужно менять условия или инклюдить уже не переменную, а результаты функции (которые ещё выбрать нужно правильно).
    Т.е., кроме самого регулярника нужно ещё учитывать что же оно реально делает в функции.
    мне функция preg_match не нравится , имхо для таких целей лучше preg_match_all использовать , она не остановится после первого нахождения.
    мне больше по душе htmlspecialchars(preg_replace("/[^1-9]/"),"",$id)


    В общем , надо память освежить - пошел читать http://php.net/

  11. #11
    Мастер Аватар для DogEater
    Регистрация
    03.11.2001
    Адрес
    Подмосковье
    Возраст
    52
    Сообщений
    4,442

    Ответ: PHP-вопрос

    Цитата Сообщение от Mirnyi Посмотреть сообщение
    Или я ничего не понимаю, или встретив одну цифру в subject, эта функция вернёт не 0, т.е. истину.
    Т.е., можно и такую маску задать, но тогда нужно менять условия или инклюдить уже не переменную, а результаты функции (которые ещё выбрать нужно правильно).
    Т.е., кроме самого регулярника нужно ещё учитывать что же оно реально делает в функции.
    Отнесу к последнему выражению.
    идёт начало строки, затем мусор (любое количество не-цифр), если затем встречается цифра от 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

  12. #12
    Инспектор
    Регистрация
    12.08.2008
    Адрес
    Новосибирск
    Сообщений
    5,345

    Ответ: PHP-вопрос

    Цитата Сообщение от DogEater Посмотреть сообщение
    Отнесу к последнему выражению.
    идёт начало строки, затем мусор (любое количество не-цифр), если затем встречается цифра от 1 до 9 то хорошо, а если после неё будет цифра от 0 до 9 -0 то ещё лучше(не будет второй цифры - фиг с ней, она не обязательна) - запомним эти цифры (потому что в скобках), а всё остальное - остаток строки до конца совпадёт с сочетанием .*(любое количество любых символов), но мы запомним первые попавшиеся цифры, и возьмём их из $id[1] (потому что в $id[0] будет всё что совпало с шаблоном, а в $id[1] - только то, что совпало в первых скобках)
    таким образом мы вытащим из строки с мусором число от 1 до 99.
    Всё правильно, но, согласись, что это всёже не /[0-9]/, подставленное в первый пример.
    А ошибки при использовании регулярных выражений вылазят довольно часто даже у профессионалов.
    Я только говорю о том, что когда определён конечный словарь того, что может быть в запросе, часто проще и надёжнее запрос проверить в лоб.
    Всё, что в $_GET генерируется самим кодом. Если это не бескончная случайная последовательность символов (не может быть любым), то всё что содержит мусор или проще говоря не совпадает с ограниченным числом возможных значений можно просто послать нафиг.
    Это и в парсерах логов порой лучше работает, чем регулярное выражение в 14 этажей.

    Кстати, спасибо за наводку на книжку - уже читаю.

  13. #13
    Мастер Аватар для DogEater
    Регистрация
    03.11.2001
    Адрес
    Подмосковье
    Возраст
    52
    Сообщений
    4,442

    Ответ: PHP-вопрос

    Цитата Сообщение от Mirnyi Посмотреть сообщение
    Всё правильно, но, согласись, что это всёже не /[0-9]/, подставленное в первый пример.
    А ошибки при использовании регулярных выражений вылазят довольно часто даже у профессионалов.
    Я только говорю о том, что когда определён конечный словарь того, что может быть в запросе, часто проще и надёжнее запрос проверить в лоб.
    Всё, что в $_GET генерируется самим кодом. Если это не бескончная случайная последовательность символов (не может быть любым), то всё что содержит мусор или проще говоря не совпадает с ограниченным числом возможных значений можно просто послать нафиг.
    Это и в парсерах логов порой лучше работает, чем регулярное выражение в 14 этажей.
    У нас простейший пример - 2 цифры. В конце концов вполне сойдёт (\d\d?)
    Поскольку я - сисадмин, значит профессиональный параноик. Поэтому входной контроль данных - не считаю лишним. Мало ли кто чего пошлёт. Код или не код сгенерировал запрос - я то откуда знаю?
    вот - пример - проверка на похожесть ldap rdn с одновременным разбиенем на массив:
    Код:
    preg_match_all ("/([^=,]+=[^=,]+),?/",$person,$target)
    а уж про парсинг пчелайновских счетов я вообще молчу(номера, длительность, цена)
    Цитата Сообщение от Mirnyi Посмотреть сообщение
    Кстати, спасибо за наводку на книжку - уже читаю.
    Джеффри обещал, что книга будет читаться как роман. Не соврал.
    "Прежде чем открыть огонь - оглянись!"
    А.В. Ворожейкин "Сильнее смерти", стр 9.
    "<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
    Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
    © DEDA
    1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64

  14. #14
    Мастер Аватар для DogEater
    Регистрация
    03.11.2001
    Адрес
    Подмосковье
    Возраст
    52
    Сообщений
    4,442

    Ответ: PHP-вопрос

    Цитата Сообщение от Mirnyi Посмотреть сообщение
    И тогда функция вернёт истину на любой набор символов хоть с одной цифрой (если я не ошибаюсь)
    Вот за то и не люблю регулярные, что можно написать такого, что сам потом не разберёшь.
    Но, конечно, это только отмазка, чтобы мозг не ломать "китайской грамотой".
    Если знать их хорошо и функции которые с ними работают, то инструмент мощнейший.
    Не пожидись, купи себе немножечко Джеффри Фридла, "Регулярные выражения". Я купил второе издание в 2003 за 256 рублей, и до сих пор не жалею.
    Даже если ты осилишь первые 3 главы - это сильно поднимет твой уровень.
    "Прежде чем открыть огонь - оглянись!"
    А.В. Ворожейкин "Сильнее смерти", стр 9.
    "<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
    Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
    © DEDA
    1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •