|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
Добрый день! Помогите разобраться с регулярными выражениями. Пытаюсь сделать проверку переменной на соответствие маске с помощью 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)/-прошу ткнуть носом если я не прав Проясните пожалуйста,где я ошибаюсь в составлении выражений.... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 00:14 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
с чем то разобрался, для кирилицы не хватало модификатора u ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 00:18 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
wlad1164, во всех трех случаях ваши регулярные выражения примут все, что угодно, до маски. Так и задумано? Шаблону [0-9]{3,6} соответствуют любые сочетания цифр, если их от трех до шести. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 00:56 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
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" являются допустимым или нет. Формально, указанные числа входят в диапазон допустимых по правилам отбрасывания ведущих нулей. Но регекспы не проверяют числа, а проверяют строки, символы. Таким образом, данные варианты не пройдут проверки по приведенным выше маскам. Можно, конечно, добавить в маску в начале "любое количество нулей". Со вторым и третьим заданием аналогично. Понятие "неСодержатьСимволовПослеЧисла" не понятно, что означает. То ли "число должно быть в конце строки", то ли что-то другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 12:12 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
vkle, спасибо что внесли чуть больше ясности, если я Вас правильно понял то получил вот такой вариант: /^ИНФО[\- ]{1}[0-9]{3,6}[ \n\r]{0,3}$/u 1.в начале строки должно быть "ИНФО" 2.после п.1 должен идти символ "тире" либо "пробел" в количестве 1 шт. 3.после него должно идти число от 3х до 6 знаков (000-999999) 4.после п.3 может быть (а может не быть) символ пробела,переноса или возврата каретки либо несколько подряд каждого из них, но не более 3х 5.конец строки Если не сложно, подтолкните меня еще раз =) надеюсь я двигаюсь в верном направлении. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 19:34 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
1. верно 2. верно, но для одного символа квантификатор не требуется. Кстати, привет от любителей копипаста "из Ворда": тире бывают разные, аж трех видов. wlad11643.после него должно идти число от 3х до 6 знаков (000-999999)Жульничаете? ;-) Было же "от трехсот до 999999". Задача в лабе поменялась на лету? А реальную программу как писать будете? ;-) 4. и 5. Наверно, есть смысл разобраться с понятиями. "Конец строки" - штука растяжимая. В ряде случаев $ означает, что далее идет [\r\n], а в ряде случаев, что байты закончились. Многострочный режим посмотрите, если интересно. Мне кажется, тут перебор какой-то. Докучи: Ваши данные откуда пришли? В каком виде пришли - как единый текст с множеством переводов строки или как одна строка с консоли на вводе? Или Ваша проверяемая строка - элемент массива, в который был построчно прочитан файл, созданный на неизвестном компьютере? А "построчно" - это как - с переводами строки или без? Понимая, с каким данными предстоит работать и что именно в них искать или проверять, составите не столько регексп, сколько алгоритм обработки. Кроме регекспа там может быть что-то другое. В Вашем регекспе три пробела подряд допустимы. Но зачем? Пробелом в реальной жизни строку не заканчивают обычно, и, тем более, тремя. И пробелом с интером - тоже. Есть смысл рассматривать без абстракций и высасывания из пальца. "$" в смысле конца строки обычно достаточно, но оно зависит от. Например, перед проверкой можно очистить строку от мусора в начале и в конце и только потом проверять. При копипасте в поле ввода, например, может прицепиться табуляция. В начале. Мешает? Конечно, мешает. Порядок сортировки нарушается при лишней табуляции, например. А в конце может прицепиться? Тоже может. И оператор даже тут не виноват, он не видит пробельный символ по самому определению пробельного символа! Потому, ещё до проверок, весь потенциальный мусор есть смысл зачистить. Или утвердить, что в проверяемом тексте не будет лишних переводов строки, табуляций и т.п. И только потом проверять по содержимому. Проверять же "вообще" - занятие, отчасти, неблагодарное. Либо, оно будет достаточно формальным. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 20:49 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
vkle2. верно, но для одного символа квантификатор не требуется. Наверное я предполагал что тире не такой уж простой (шутка) vkleЖульничаете? ;-) Было же "от трехсот до 999999". Задача в лабе поменялась на лету? А реальную программу как писать будете? ;-) Ну последний мой вариант это помесь из 3х вариантов выше =) Это не лаба, это попытка понять как оно работает для создания php скрипта vkle"Конец строки" - штука растяжимая. В ряде случаев $ означает, что далее идет [\r\n], а в ряде случаев, что байты закончились. Многострочный режим посмотрите, если интересно. Мне кажется, тут перебор какой-то. Спасибо, попытаюсь понять что это и с чем его едят =) Понять я думаю это можно только зная какие данные будут на вводе, я прав? vkleВаши данные откуда пришли? В каком виде пришли - как единый текст с множеством переводов строки или как одна строка с консоли на вводе? Данные в php поступают из стороннего приложения, которое передает php скрипту post содержащий внутри json массив, сам массив данных формируется исходя из данных введенных пользователем, отсюда и вытекла проверка формата, ведь каждый может писать одно и то же по разному vkleВ Вашем регекспе три пробела подряд допустимы. Но зачем? Пробелом в реальной жизни строку не заканчивают обычно, и, тем более, тремя. И пробелом с интером - тоже. Есть смысл рассматривать без абстракций и высасывания из пальца. в моем случае как раз очень часто эту строку заканчивают пробелом,либо переносом (вводил текст нажал enter, а потом нашел кнопочку отправить и нажал её) vkle"$" в смысле конца строки обычно достаточно, но оно зависит от. Например, перед проверкой можно очистить строку от мусора в начале и в конце и только потом проверять. Над этим уже думал, но хорошего решения придумать не смог, ну кроме банального: заменить все "не нужные" символы на ничего) vkle, еще раз огромное спасибо за развернутые ответы. Внесли в мою пустую голову много полезного =) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 00:49 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
wlad1164Понять я думаю это можно только зная какие данные будут на вводе, я прав?В общем, да. Если анализируете многострочный текст, его фрагменты, и там где-то должна быть искомая строка - это одно, если на входе должна быть гарантировано одна строка (данные из текстового поля ввода) - это немного другое. Например, на входе должно быть целое положительное число. Тогда алгоритм проверки регекспом (другие варианты не будем рассматривать для простоты) приблизительно такой: Код: php 1. 2.
Разумеется, затримить можно бОльший набор символов, чем предлагается по умолчанию. Другой вариант: Код: php 1. 2.
Это для примера, конечно. А теперь представим, что пользователь скопипастил число (цену, например) откуда-то из прайса. Что там может быть? "12 345,67" или, по-буржуйски, "12,345.67". Для пользователя это число, блин! Для программы - не очень. Оказывать давление на пользователя, вываливая "ERROR!!!" на любые ошибки - занятие не слишком благодарное. Аккуратно подправить и нормализовать данные яваскриптом непосредственно в поле ввода - куда гуманнее, хотя и сложнее. На серверной же стороне остается проверить уже нормализованные данные. Ибо, из штатной формы они должны бы именно такими поступить. Если уж в таком случае не прошла проверка - значит, явно, что-то не так (например, данные присылал не пользователь, а бот). Разумеется, это простейший пример. wlad1164в моем случае как раз очень часто эту строку заканчивают пробелом,либо переносом (вводил текст нажал enter, а потом нашел кнопочку отправить и нажал её)Так-так. А куда вводили текст? Если в <textarea> - то да, это текст многострочный, с переводами строки вполне может быть. А если в <input type="text" /> внутри формы - то при наличии штатного <input type="submit" /> нажатие Enter там работает как отправка формы и не попадает в само поле ввода. Что касается пробелов, то простеньким яваскриптом явный мусор вполне срезается непосредственно на поле ввода. Именно таким вот образом, как Вы и говорите:wlad1164заменить все "не нужные" символы на ничего) Конечно, я ни в коем разе не призываю отказаться от проверок на стороне сервера. Но считаю, что некоторую часть можно проверять/править на клиенте. PS: Есть ещё распространенные "проблемы" двойных и более пробелов, табуляции вместо пробелов и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 01:43 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
vkleКонечно, я ни в коем разе не призываю отказаться от проверок на стороне сервера. Но считаю, что некоторую часть можно проверять/править на клиенте. Я бы с радостью, но туда откуда берутся данные влезть никак не могу, все что имею: сформированный json который передается php скрипту. Не знаю насколько это правильно, но как вариант делать 2 переменных: 1-исходные данные на вводе, 2-копия первой, но очищенная. и скрипту подсовывать вторую переменную. Две, потому что в ряде случаев будет необходима переменная в том первоначальном виде (хотя с другой стороны её можно будет всегда получить из file_get_contents('php://input') В целом же эта проверка нужна для того чтобы php скрипт понял что делать с этими данными, может быть множество вариантов+1 вариант если не нашел шаблон. Т.е. если данные на входе соответствуют формату "3буквы 2цифры" то их обработать по алгоритм1 если данные на входе соответствуют формату "4 буквы 6цифр" то их обработать по алгоритм2 если данные не соответствуют ни одному из форматов - алгоритм10 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 12:53 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
wlad1164, При таком раскладе промежуточных переменных запросто получится более чем одна, и это не проблема. Последовательность проверок, вероятно, придется уточнять по месту. Например, данные, имеющие "4 буквы и 6 цифр" укладываются в маску "3 буквы и 2 цифры". Видимо, вторую маску для перехода на алгоритм-2 следует проверять раньше первой. Как вариант, вполне возможно, что на первом этапе данные пройдут предварительную очистку от мусора (минимально - пробельные символы и переводы строки в начале/конце и, возможно, двойные пробелы и замена табуляции на пробел). Тогда появится вполне реальная возможность использовать начало и/или конец строки при проверках без условий вроде "возможно то ли пробел, то ли \r, то ли \n до трех раз". Разные варианты перевода строки, если таковые ожидаются в данных на выходе, есть смысл привести к какому-то одному стандарту, например, использовать только \n. Подробные чистки/правки можно делать непосредственно в применимом алгоритме (какие это буквы, преобразовать ли что-то в строчные/заглавные, восстановить пробел после точки/запятой по правилам русского языка и т.п.). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 13:34 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
vkle, можно Вас атаковать еще небольшой кучкой глупых вопросов? Не против если постучусь в скайп указанный в профиле? Вопросы глупые и думаю не стоит для них создавать темы, да и сами вопросы несут ответ рода "да" "нет" ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2018, 19:54 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
wlad1164, Можно и в скайпе, только в приветственном сообщении пишите повод. И скайп не постоянно у меня перед глазами, хотя и запущен на домашнем компе. Ну а почему нельзя здесь написать вопросы? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2018, 20:23 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
Личный консультант? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2018, 21:09 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
Hett, нет, но вопросы на мой взгляд и правда очень детские)) Например: имеется скрипт, который выполняется 2-10 сек (в зависимости от данных на вводе) Моделируем ситуацию: с интервалом в 1 сек вызываем скрипт с разными данными на вводе Будут ли "перемешиваться" переменные в глобальной области видимости? т.е. предположим в начале скрипта есть команда $a=$_POST['name'] Переменной присвоится значение name1 и скрипт продолжит выполняться, во время выполнения этот же скрипт вызовут с параметром name2, что выведет echo $a в конце выполнения первого вызова? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2018, 21:19 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
wlad1164, ну, так смоделируйте ситуацию: напишите скрипт, придумайте данные, с которыми ответ на ваш вопрос будет однозначен, и запускайте с интервалом в 1 с. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2018, 22:22 |
|
Регулярные выражения..
|
|||
---|---|---|---|
#18+
wlad1164, Наверно, есть смысл изучить основы выполнения программ в компьютере. Если какую-то программу (пусть будет что-нить уровня хеллоуворд) запустить с некими параметрами, а затем, не дожидаясь окончания работы этого экземпляра программы, запустить эту же программу с другими параметрами - что будет с программой, запущенной первой? Вероятно, она даже и не будет знать о том, что выполняется ещё один или более экземпляров. Если только сама не поинтересуется у системы. Ну и память данных выделяется для каждого экземпляра программы своя. Попытки программы вылезти за пределы дозволенного будут строго пресечены системой. Как то так. В контексте вебсервера аналогично. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2018, 22:27 |
|
|
start [/forum/topic.php?fid=23&msg=39712977&tid=1460141]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 169ms |
0 / 0 |