powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Регулярные выражения..
16 сообщений из 16, страница 1 из 1
Регулярные выражения..
    #39712154
wlad1164
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Помогите разобраться с регулярными выражениями.
Пытаюсь сделать проверку переменной на соответствие маске с помощью preg_match
1. Переменная должна содержать: "ИНФО"+1любойСимвол+числоОт300до999999
Примеры: "ИНФО 321","ИНФО-321"-соответсвтует
" ИНФО 123","ИНФО- 321","ИНФО321","ИНФО 321вл"-не соответствет
Мой вариант выражения /ИНФО.[0-9]{3,6}/-прошу ткнуть носом если я не прав
2.Переменая должна содержать: "АПЦ"+1любойСимвол+числоОт0до99+неСодержатьСимволовПослеЧисла
Примеры: "АПЦ 1","АПЦ-22","АПЦ-01"-соответствует
"АПЦ2","АПЦ-222","АПЦ-22ы"-не соответствует
Мой вариант выражения /АПЦ.[0-9]{1,2}[^0-9А-я\-]/-прошу ткнуть носом если я не прав
3.Переменная должна содержать то же что и переменная 2, но после числа должно быть слово из списка
Мой вариант выражения /АПЦ.[0-9]{1,2}(слово1|слово2)/-прошу ткнуть носом если я не прав

Проясните пожалуйста,где я ошибаюсь в составлении выражений....
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39712155
wlad1164
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
с чем то разобрался, для кирилицы не хватало модификатора u
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39712164
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wlad1164, во всех трех случаях ваши регулярные выражения примут все, что угодно, до маски. Так и задумано? Шаблону [0-9]{3,6} соответствуют любые сочетания цифр, если их от трех до шести.
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39712348
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wlad11641. Переменная должна содержать: "ИНФО"+1любойСимвол+числоОт300до999999
Примеры: "ИНФО 321","ИНФО-321"-соответсвтует
" ИНФО 123","ИНФО- 321","ИНФО321","ИНФО 321вл"-не соответствет
Мой вариант выражения /ИНФО.[0-9]{3,6}/-прошу ткнуть носом если я не прав
Так как понятие "один любой символ", обозначаемый точкой, включает в себя цифры и пробельные символы, а начало и конец строки в регекспе не обозначены (проверяется любой фрагмент строки), то указанной Вами регулярке "не соответствовать" будут лишь варианты "ИНФО- 321" (более одного любого символа перед цифрой) и "ИНФО321" (тройка - это один любой символ, а далее не хватает обязательных цифр). Остальные варианты пройдут проверку. Так же пройдет и вариант "МегаИНФО987654321".

Регекспом проверять "число От 300 до 999999" следует по нескольким маскам.
Допустимыми здесь являются маски "первая цифра от 3 до 9, а далее две любых цифры" и "первая цифра от 1 до 9, а далее от трех до пяти любых цифр".
Кроме того, следует определиться, варианты записи числа "00321" и "000000999999" являются допустимым или нет. Формально, указанные числа входят в диапазон допустимых по правилам отбрасывания ведущих нулей. Но регекспы не проверяют числа, а проверяют строки, символы. Таким образом, данные варианты не пройдут проверки по приведенным выше маскам. Можно, конечно, добавить в маску в начале "любое количество нулей".

Со вторым и третьим заданием аналогично. Понятие "неСодержатьСимволовПослеЧисла" не понятно, что означает. То ли "число должно быть в конце строки", то ли что-то другое.
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39712647
wlad1164
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle, спасибо что внесли чуть больше ясности, если я Вас правильно понял то получил вот такой вариант: /^ИНФО[\- ]{1}[0-9]{3,6}[ \n\r]{0,3}$/u

1.в начале строки должно быть "ИНФО"
2.после п.1 должен идти символ "тире" либо "пробел" в количестве 1 шт.
3.после него должно идти число от 3х до 6 знаков (000-999999)
4.после п.3 может быть (а может не быть) символ пробела,переноса или возврата каретки либо несколько подряд каждого из них, но не более 3х
5.конец строки

Если не сложно, подтолкните меня еще раз =) надеюсь я двигаюсь в верном направлении.
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39712675
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. верно

2. верно, но для одного символа квантификатор не требуется.
Кстати, привет от любителей копипаста "из Ворда": тире бывают разные, аж трех видов.

wlad11643.после него должно идти число от 3х до 6 знаков (000-999999)Жульничаете? ;-) Было же "от трехсот до 999999". Задача в лабе поменялась на лету? А реальную программу как писать будете? ;-)

4. и 5. Наверно, есть смысл разобраться с понятиями. "Конец строки" - штука растяжимая. В ряде случаев $ означает, что далее идет [\r\n], а в ряде случаев, что байты закончились. Многострочный режим посмотрите, если интересно. Мне кажется, тут перебор какой-то.

Докучи:
Ваши данные откуда пришли? В каком виде пришли - как единый текст с множеством переводов строки или как одна строка с консоли на вводе? Или Ваша проверяемая строка - элемент массива, в который был построчно прочитан файл, созданный на неизвестном компьютере? А "построчно" - это как - с переводами строки или без? Понимая, с каким данными предстоит работать и что именно в них искать или проверять, составите не столько регексп, сколько алгоритм обработки. Кроме регекспа там может быть что-то другое.

В Вашем регекспе три пробела подряд допустимы. Но зачем? Пробелом в реальной жизни строку не заканчивают обычно, и, тем более, тремя. И пробелом с интером - тоже. Есть смысл рассматривать без абстракций и высасывания из пальца.

"$" в смысле конца строки обычно достаточно, но оно зависит от. Например, перед проверкой можно очистить строку от мусора в начале и в конце и только потом проверять. При копипасте в поле ввода, например, может прицепиться табуляция. В начале. Мешает? Конечно, мешает. Порядок сортировки нарушается при лишней табуляции, например. А в конце может прицепиться? Тоже может. И оператор даже тут не виноват, он не видит пробельный символ по самому определению пробельного символа! Потому, ещё до проверок, весь потенциальный мусор есть смысл зачистить. Или утвердить, что в проверяемом тексте не будет лишних переводов строки, табуляций и т.п. И только потом проверять по содержимому. Проверять же "вообще" - занятие, отчасти, неблагодарное. Либо, оно будет достаточно формальным.
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39712739
wlad1164
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle2. верно, но для одного символа квантификатор не требуется.
Наверное я предполагал что тире не такой уж простой (шутка)

vkleЖульничаете? ;-) Было же "от трехсот до 999999". Задача в лабе поменялась на лету? А реальную программу как писать будете? ;-)

Ну последний мой вариант это помесь из 3х вариантов выше =)
Это не лаба, это попытка понять как оно работает для создания php скрипта

vkle"Конец строки" - штука растяжимая. В ряде случаев $ означает, что далее идет [\r\n], а в ряде случаев, что байты закончились. Многострочный режим посмотрите, если интересно. Мне кажется, тут перебор какой-то.
Спасибо, попытаюсь понять что это и с чем его едят =) Понять я думаю это можно только зная какие данные будут на вводе, я прав?

vkleВаши данные откуда пришли? В каком виде пришли - как единый текст с множеством переводов строки или как одна строка с консоли на вводе?
Данные в php поступают из стороннего приложения, которое передает php скрипту post содержащий внутри json массив, сам массив данных формируется исходя из данных введенных пользователем, отсюда и вытекла проверка формата, ведь каждый может писать одно и то же по разному

vkleВ Вашем регекспе три пробела подряд допустимы. Но зачем? Пробелом в реальной жизни строку не заканчивают обычно, и, тем более, тремя. И пробелом с интером - тоже. Есть смысл рассматривать без абстракций и высасывания из пальца.

в моем случае как раз очень часто эту строку заканчивают пробелом,либо переносом (вводил текст нажал enter, а потом нашел кнопочку отправить и нажал её)

vkle"$" в смысле конца строки обычно достаточно, но оно зависит от. Например, перед проверкой можно очистить строку от мусора в начале и в конце и только потом проверять.
Над этим уже думал, но хорошего решения придумать не смог, ну кроме банального: заменить все "не нужные" символы на ничего)


vkle, еще раз огромное спасибо за развернутые ответы. Внесли в мою пустую голову много полезного =)
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39712740
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wlad1164Понять я думаю это можно только зная какие данные будут на вводе, я прав?В общем, да. Если анализируете многострочный текст, его фрагменты, и там где-то должна быть искомая строка - это одно, если на входе должна быть гарантировано одна строка (данные из текстового поля ввода) - это немного другое.
Например, на входе должно быть целое положительное число. Тогда алгоритм проверки регекспом (другие варианты не будем рассматривать для простоты) приблизительно такой:
Код: php
1.
2.
$data = trim($_POST['data']);
if(!preg_match('/^\d+$/', $data) die('Данные ошибочны');

Разумеется, затримить можно бОльший набор символов, чем предлагается по умолчанию. Другой вариант:
Код: php
1.
2.
if(!preg_match('/(\d+)/', $_POST['data'], $m) die('Данные ошибочны');
$data = $m[1];

Это для примера, конечно.

А теперь представим, что пользователь скопипастил число (цену, например) откуда-то из прайса. Что там может быть? "12 345,67" или, по-буржуйски, "12,345.67". Для пользователя это число, блин! Для программы - не очень. Оказывать давление на пользователя, вываливая "ERROR!!!" на любые ошибки - занятие не слишком благодарное. Аккуратно подправить и нормализовать данные яваскриптом непосредственно в поле ввода - куда гуманнее, хотя и сложнее. На серверной же стороне остается проверить уже нормализованные данные. Ибо, из штатной формы они должны бы именно такими поступить. Если уж в таком случае не прошла проверка - значит, явно, что-то не так (например, данные присылал не пользователь, а бот). Разумеется, это простейший пример.

wlad1164в моем случае как раз очень часто эту строку заканчивают пробелом,либо переносом (вводил текст нажал enter, а потом нашел кнопочку отправить и нажал её)Так-так. А куда вводили текст? Если в <textarea> - то да, это текст многострочный, с переводами строки вполне может быть. А если в <input type="text" /> внутри формы - то при наличии штатного <input type="submit" /> нажатие Enter там работает как отправка формы и не попадает в само поле ввода.
Что касается пробелов, то простеньким яваскриптом явный мусор вполне срезается непосредственно на поле ввода. Именно таким вот образом, как Вы и говорите:wlad1164заменить все "не нужные" символы на ничего)

Конечно, я ни в коем разе не призываю отказаться от проверок на стороне сервера. Но считаю, что некоторую часть можно проверять/править на клиенте.

PS: Есть ещё распространенные "проблемы" двойных и более пробелов, табуляции вместо пробелов и т.п.
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39712948
wlad1164
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleКонечно, я ни в коем разе не призываю отказаться от проверок на стороне сервера. Но считаю, что некоторую часть можно проверять/править на клиенте.
Я бы с радостью, но туда откуда берутся данные влезть никак не могу, все что имею: сформированный json который передается php скрипту.

Не знаю насколько это правильно, но как вариант делать 2 переменных: 1-исходные данные на вводе, 2-копия первой, но очищенная. и скрипту подсовывать вторую переменную.
Две, потому что в ряде случаев будет необходима переменная в том первоначальном виде (хотя с другой стороны её можно будет всегда получить из file_get_contents('php://input')

В целом же эта проверка нужна для того чтобы php скрипт понял что делать с этими данными, может быть множество вариантов+1 вариант если не нашел шаблон.

Т.е. если данные на входе соответствуют формату "3буквы 2цифры" то их обработать по алгоритм1
если данные на входе соответствуют формату "4 буквы 6цифр" то их обработать по алгоритм2
если данные не соответствуют ни одному из форматов - алгоритм10
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39712977
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wlad1164,

При таком раскладе промежуточных переменных запросто получится более чем одна, и это не проблема.

Последовательность проверок, вероятно, придется уточнять по месту. Например, данные, имеющие "4 буквы и 6 цифр" укладываются в маску "3 буквы и 2 цифры". Видимо, вторую маску для перехода на алгоритм-2 следует проверять раньше первой.

Как вариант, вполне возможно, что на первом этапе данные пройдут предварительную очистку от мусора (минимально - пробельные символы и переводы строки в начале/конце и, возможно, двойные пробелы и замена табуляции на пробел). Тогда появится вполне реальная возможность использовать начало и/или конец строки при проверках без условий вроде "возможно то ли пробел, то ли \r, то ли \n до трех раз". Разные варианты перевода строки, если таковые ожидаются в данных на выходе, есть смысл привести к какому-то одному стандарту, например, использовать только \n.

Подробные чистки/правки можно делать непосредственно в применимом алгоритме (какие это буквы, преобразовать ли что-то в строчные/заглавные, восстановить пробел после точки/запятой по правилам русского языка и т.п.).
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39715764
wlad1164
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle, можно Вас атаковать еще небольшой кучкой глупых вопросов? Не против если постучусь в скайп указанный в профиле?
Вопросы глупые и думаю не стоит для них создавать темы, да и сами вопросы несут ответ рода "да" "нет"
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39715777
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wlad1164,

Можно и в скайпе, только в приветственном сообщении пишите повод. И скайп не постоянно у меня перед глазами, хотя и запущен на домашнем компе. Ну а почему нельзя здесь написать вопросы?
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39715795
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Личный консультант? :)
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39715801
wlad1164
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hett, нет, но вопросы на мой взгляд и правда очень детские))

Например: имеется скрипт, который выполняется 2-10 сек (в зависимости от данных на вводе)
Моделируем ситуацию: с интервалом в 1 сек вызываем скрипт с разными данными на вводе

Будут ли "перемешиваться" переменные в глобальной области видимости?
т.е. предположим в начале скрипта есть команда $a=$_POST['name']
Переменной присвоится значение name1 и скрипт продолжит выполняться, во время выполнения этот же скрипт вызовут с параметром name2, что выведет echo $a в конце выполнения первого вызова?
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39715829
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wlad1164, ну, так смоделируйте ситуацию: напишите скрипт, придумайте данные, с которыми ответ на ваш вопрос будет однозначен, и запускайте с интервалом в 1 с.
...
Рейтинг: 0 / 0
Регулярные выражения..
    #39715830
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wlad1164,

Наверно, есть смысл изучить основы выполнения программ в компьютере. Если какую-то программу (пусть будет что-нить уровня хеллоуворд) запустить с некими параметрами, а затем, не дожидаясь окончания работы этого экземпляра программы, запустить эту же программу с другими параметрами - что будет с программой, запущенной первой? Вероятно, она даже и не будет знать о том, что выполняется ещё один или более экземпляров. Если только сама не поинтересуется у системы. Ну и память данных выделяется для каждого экземпляра программы своя. Попытки программы вылезти за пределы дозволенного будут строго пресечены системой. Как то так.
В контексте вебсервера аналогично.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Регулярные выражения..
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]