Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Регулярные выражения

9.8K
12 февраля 2007 года
SanAdlen
53 / / 03.11.2006
Здравствуйте, какой регулярное выражение нужно использовать что-бы PHP видел или показывал только число от 1 до 1000
 
Код:
<?php if(ereg(".(1-1000)", $var8_min))

Что то вроде этого?
Но неработает...
Помогите пожалйста
13
12 февраля 2007 года
RussianSpy
3.0K / / 04.07.2006
Цитата: SanAdlen
Здравствуйте, какой регулярное выражение нужно использовать что-бы PHP видел или показывал только число от 1 до 1000
 
Код:
<?php if(ereg(".(1-1000)", $var8_min))

Что то вроде этого?
Но неработает...
Помогите пожалйста



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

9.8K
12 февраля 2007 года
SanAdlen
53 / / 03.11.2006
Мне нужен скрипт который будет принемять из поля input текст и если там цифры от 1 до 1000 то выводит сообщение верно
13
12 февраля 2007 года
RussianSpy
3.0K / / 04.07.2006
Цитата: SanAdlen
Мне нужен скрипт который будет принемять из поля input текст и если там цифры от 1 до 1000 то выводит сообщение верно



Ну во-первых от 1 до 1000 это не цифры, а числа.
А сделать можно намного проще

 
Код:
<?
$var8_min = intval($var8_min);
if($var8_min>=1 && $var8_min<=1000) echo "Все ОК";
?>


UPDATE: Погоди-ка. Присылается число? Или текст содержащий числа? То есть придет "876" или "Король имел в подчинении 542 конные кавалерии"???
9.8K
12 февраля 2007 года
SanAdlen
53 / / 03.11.2006
Должно быть только число если есть посторонний символ или уже перевалило за 1000 то уже пишет неверно
9.8K
12 февраля 2007 года
SanAdlen
53 / / 03.11.2006
Спасибо! все работает!
8
12 февраля 2007 года
mfender
3.5K / / 15.06.2005
C ereg нужно завязывать.
Я бы сделал так:
 
Код:
$str = preg_replace("/[^0-9]/", "", $str);
$str = preg_replace("/^0+(\d*)$/", "$1", $str);
$str = $str >= 1 && $str <= 1000 ? $str : 0;
12
14 февраля 2007 года
alekciy
3.0K / / 13.12.2005
Для такой задачи с регулярками завязывать нужно ;)
8
14 февраля 2007 года
mfender
3.5K / / 15.06.2005
Цитата: alekciy
Для такой задачи с регулярками завязывать нужно ;)


А что, можно ещё как-то?

13
14 февраля 2007 года
RussianSpy
3.0K / / 04.07.2006
Цитата: mfender
А что, можно ещё как-то?



Прочитай внимательно мой ответ. Автор топика таким образом (через регулярные выражения) принимал решение о том выводить ему сообщение на экран или нет.

8
14 февраля 2007 года
mfender
3.5K / / 15.06.2005
Цитата: RussianSpy
Прочитай внимательно мой ответ. Автор топика таким образом (через регулярные выражения) принимал решение о том выводить ему сообщение на экран или нет.


Ты его почитай:

Цитата:
что-бы PHP видел или показывал только число от 1 до 1000


Ему нужно число. А в твоём совете всё правильно (для принятия решения), за исключением одного: вдруг $var8_min на входе будет вида лдрыв89анлфыовар98ывр оыв8 79ывар фы8ва7 ?

13
14 февраля 2007 года
RussianSpy
3.0K / / 04.07.2006
2mfender: Что с тобой сегодня? Я об этом ведь спросил автора - тот сказал что не будет. Ну не будет так не будет - дальше его проблемы начинаются.

ЗЫ а с ereg и в самом деле надо завязывать :)
8
14 февраля 2007 года
mfender
3.5K / / 15.06.2005
Цитата: RussianSpy
2mfender: Что с тобой сегодня? Я об этом ведь спросил автора - тот сказал что не будет. Ну не будет так не будет - дальше его проблемы начинаются.

ЗЫ а с ereg и в самом деле надо завязывать :)


Это он сейчас говорит, что не будет. Я смотрю ширее (ширше) всегда. Не только сегодня. :D
В конце-концов, регулярные выражения изобрели не для того, чтобы отказываться от удобства их использования.

12
14 февраля 2007 года
alekciy
3.0K / / 13.12.2005
Однако же все нужно юзать по месту. Если у нас есть числа, то для проверки вхождения в диапазон регулярки не нужны. Насчет того, что могут заслать не числа... ну так на что прогеру голова? Имхо, проверка данных исходящих от пользователя на корректность, а так же приведение к нужным типам должна у хорошего прогера быть на уровне инстинкта.
8
14 февраля 2007 года
mfender
3.5K / / 15.06.2005
Цитата: alekciy
Однако же все нужно юзать по месту. Если у нас есть числа, то для проверки вхождения в диапазон регулярки не нужны. Насчет того, что могут заслать не числа... ну так на что прогеру голова? Имхо, проверка данных исходящих от пользователя на корректность, а так же приведение к нужным типам должна у хорошего прогера быть на уровне инстинкта.


И всё же, какой более разумный есть способ из произвольной строки получить число, если не регулярные выражения?

12
15 февраля 2007 года
alekciy
3.0K / / 13.12.2005
Для поиска в строке числа конечно лучше регулярок нет, кто спорит.
2.1K
23 июня 2007 года
FIRESTARTER
90 / / 29.05.2005
Вот решил попробовать научится работать с регулярными выражениями,
попробовал написать regexp для проверки правильности введённого адреса ё-mail:
/^[a-z_]+[\.a-z\-_]*@{1}[a-z]+[\.a-z\-_]*[a-z]\.[a-z]{2,4}$/i
В принципе работает,но всё ли там правильно?
12
24 июня 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: FIRESTARTER
Вот решил попробовать научится работать с регулярными выражениями,
попробовал написать regexp для проверки правильности введённого адреса ё-mail:
/^[a-z_]+[\.a-z\-_]*@{1}[a-z]+[\.a-z\-_]*[a-z]\.[a-z]{2,4}$/i
В принципе работает,но всё ли там правильно?



Не стоит изобретать велосипед. Для проверки мыла на валидность давно уже создан проверенные регулярки. В том же Zend Framework.

2.1K
24 июня 2007 года
FIRESTARTER
90 / / 29.05.2005
Тем не менее самому их создавать тоже надо уметь.
Я досих пор так и не научился применять скобки в регулярках.
Говорится что в скобках пишут дополнительное рег.выражение .
Вот пример из статьи:
[color=green]/^\w+([\.\w]+)*\w@\w((\.\w)*\w+)*\.\w{2,3}$/[/color]
Что делает парсер,когда ему попадается [color=green]([\.\w]+)*[/color]?
Ну я читал,что он вызывает себя для поиска по выражению в скобках...,но для чего в скобках [color=green]+[/color],а за скобками [color=green]*[/color]? (Я знаю что "+" означает повтор 1 или более раз, "*" 0 или более)
16K
24 июня 2007 года
Бян
43 / / 05.09.2006
может оффтопик.
Советую программку Regexp Coach (http://weitz.de/regex-coach/). очень помогает в составлении регулярных выражений.
12
24 июня 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: FIRESTARTER

Что делает парсер,когда ему попадается [color=green]([\.\w]+)*[/color]?
Ну я читал,что он вызывает себя для поиска по выражению в скобках...,но для чего в скобках [color=green]+[/color],а за скобками [color=green]*[/color]? (Я знаю что "+" означает повтор 1 или более раз, "*" 0 или более)


Все очень просто. Выражение в квадратных скобках называется символьный класс. Он соответсвует одному символу в строке поиска. А выражение в круглых скобках называется подмаска и соответсвует нескольким символам в строке поиска и интерпретируется как единое целое. Например шаблон (дан) в строке 'данные' найдет дан. А для строки 'да нные' не найдет ни чего, т.к. в подмаске нет пробела. Кроме того подмаски возращаются в специальный массив откуда их потом можно выудить. Бывает порой очень полезно.

Поясню твой шаблон на примере строки поиска 'мой номер 245' (два пробела между мой и номер).

Шаблон [\.\w] выуживает из строки поиска по одному символу если этот символ: буква, цифра, знак подчеркивания (метасимвол /w) и точка. Квалификатор плюс говорит о том, что вхождений может быть 1 и более раз.

Когда анализатор начинает разбор, то берет сначала букву 'м'. Она соответствует шаблону [\.\w]. Но поиск соответсвия на этом не заканчивается и результаты не возращаются потому что есть еще квалификатор. По умолчанию, все квантификаторы являются "жадными", это означает, что они совпадают максимально возможное количество раз. Поэтому анализатор проверяет строку 'мо' и она соответсвует шаблону [\.\w]+. Потом добавляется еще один символ 'мой' и он тоже соответсвует шаблону [\.\w]+. Далее идет 'мой ', но он не соответствует [\.\w]+. Следовательно одно схождение 'мой' найдено. Но т.к. квалификатор плюс является по умолчанию "жадным" и в возращаемое значение попадает все слово целиком, а не каждая буква отдельно. Т.е.

 
Код:
Array
(
    [0] => Array
        (
            [0] => мой
        )

)

А не
 
Код:
Array
(
    [0] => Array
        (
            [0] => м
            [1] => о
            [2] => й
        )

)

для нежадного квалификатора (т.е. для шаблона с модификатором /[\.\w]+/U, модификатор U есть в PHP, в Perl данного модификатора нет, там все квалификаторы жадные).

А круглые скобки нужно для отлова пробелов. После нахождения первого соответствия берется следующий символ. Это пробел ' '. Он не соответсвует шаблону [\.\w], не соответсвует и ([\.\w]+). Но квалификатор звездочка говорит о том, что подмаска может входить ноль или более раз. А раз символ не соответсвует шаблону, то значит имеет 0 вхождений. И в конечно итоге совпадение имеет место, но т.к. 0 это ни чего, то в возращаемом значении ни чего и нет. В конечном итоге от preg_match_all получим:
Код:
Array
(
    [0] => Array
        (
            [0] => мой
            [1] =>
            [2] =>
            [3] => номер
            [4] =>
            [5] => 245
            [6] =>
        )
)

Обрати внимание на элементы массива [0][1], [0][2], [0][4] и [0][6]. В них находиться не пробел, а строка с пустым значением ''.

Т.е. конечная логика шаблона разбить строку на слова, причем точка включается в возращаемый набор и кроме того шаблон позволяет выудить пробелы между словами и посчитать количество этих пробелов (к примеру для последующей нормализации строки).
2.1K
04 июля 2007 года
FIRESTARTER
90 / / 29.05.2005
Спасибо! Попробую это переварить...
Цитата: Бян
может оффтопик.
Советую программку Regexp Coach (http://weitz.de/regex-coach/.) очень помогает в составлении регулярных выражений.


2 мБ для такой простенькой проги! Я скачал JavaRegexTester с sourceforge.net. 16кБ.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог