Вопрос № 114192: Здравствуйте ув. эксперты. Помогите пожалуйста с такой вот проблемкой.
В регулярных выражениях пишу вот что:
preg_match('/([А-Я])([а-я]+) ([А-Я])([а-я]+) ([А-Я])([а-я]+)/',$_POST['FIO'])!==1
Соответственно это рег. выражение берёт POST ст...
Вопрос № 114.192
Здравствуйте ув. эксперты. Помогите пожалуйста с такой вот проблемкой.
В регулярных выражениях пишу вот что:
preg_match('/([А-Я])([а-я]+) ([А-Я])([а-я]+) ([А-Я])([а-я]+)/',$_POST['FIO'])!==1
Соответственно это рег. выражение берёт POST строку и проверяет чтобы в ней было подряд 3 слова через пробел русскими буквами и каждое слово с большой буквы.
Но проблема в Ом, что это рег выражение проверяет только лишь наличие такой вот последовательности во всей строке. А мне нужно чтобы вся строка состояла только лишь из этого выражения и если в ней будет что-то ещё помимо этих 3-х слов, то нужно, чтобы возвращалось 0, а не 1. Другими словами нужно проверить чтобы в строке было только 3 слова русскими буквами через пробел и с большой буквы и ни символа более. Как это сделать?
Отвечает: Товарищ Бородин
Здравствуйте, Стас Тельнов/[анти]КИЛЛЕР!
Надо попробовать установить ограничители строки - символы "^"(начало строки) и "$"(конец строки). Кроме того, Ваше регулярное выражение можно записать короче, если писать не "([А-Я])([а-я]+)", а "([А-Я+а-я*])". Плюс тут лишний, лучше поставить звездочку, указывая тем самым, что букв в слове может быть сколько угодно. Еще лучше, на мой взгляд, выражение такое:
"/([А-Яа-я]*s?){3}/". Это регулярное выражение не отслеживает, чтобы слова начинались с большой буквы, а также есть один недостаток - в конце строки может находиться пробел. Но это решается обработкой переменной $_POST['FIO'] функциями trim и ukwords. Первая режет пробелы по краям строки, вторая поднимает регистр первой буквы слова. На вход передается строка. Просто регулярные выражения - тема, которую мало кто понимает досконально, кроме того, они работают довольно медленно, в противоположность обычным
функциям для работы со строками. Это просто совет и не более. А еще, по-моему, лучше будет сделать три отдельных поля под Ф, И и О.
Я поясню, почему такой совет. Пользователь не должен чувствовать себя как птица в клетке, у него должно быть право на ошибку. Вам только больше уважения, как программисту, будет со стороны наблюдательного пользователя, если Вы и без того не слишком-то грязную работу сделаете за него - всего один раз.
Не бойтесь нетривиальных, красивых решений. Кроме того, я советую пореже использовать регулярные выражения, особенно длинные. Нет никакой гарантии, что Вы не допустите ошибки в длинном выражении.
С уважением, Бородин Александр Олегович
--------- Ничто не сближает людей так, как совместное преступление.
Ответ отправил: Товарищ Бородин (статус: Студент)
Ответ отправлен: 15.12.2007, 22:32 Оценка за ответ: 5 Комментарий оценки: Большое спасибо, но в данном случае нет необходимости разделять ФИО на 3 переменные. А за совет по рег. выражениям большое спасибо, учту... просто мне кажется лучше использовать их, чем несколько идущих подряд if..elseif...elseif...
Отвечает: Миленин Александр
Здравствуйте, Стас Тельнов/[анти]КИЛЛЕР!
Вам нужно вначале поставить :^", а в конце "$": preg_match("/^([А-Я])([а-я]+) ([А-Я])([а-я]+) ([А-Я])([а-я]+)$/",$_POST['FIO'])!==1)
Если вам просто нужно проверить, лежат ли в переменной три слова подряд лучше воспользоваться таким рег.выром :
Ответ отправил: Миленин Александр (статус: 8-ой класс)
Ответ отправлен: 15.12.2007, 22:35 Оценка за ответ: 5 Комментарий оценки: Большое спасибо. Не знал об символах начала и конца строки))
Отвечает: BerdArt
Здравствуйте, Стас Тельнов/[анти]КИЛЛЕР!
Для этого вам необходимо так изменить ваш запрос:
preg_match('/^([А-Я])([а-я]+) ([А-Я])([а-я]+) ([А-Я])([а-я]+)$/',$_POST['FIO'])!==1
^ - начало строки
$ - конец строки
Ответ отправил: BerdArt (статус: 3-ий класс)
Ответ отправлен: 20.12.2007, 20:56