Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Программирование на PHP

  Все выпуски  

RusFAQ.ru: Программирование на PHP


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / PHP

Выпуск № 844
от 21.12.2007, 02:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 441, Экспертов: 45
В номере:Вопросов: 1, Ответов: 3


Вопрос № 114192: Здравствуйте ув. эксперты. Помогите пожалуйста с такой вот проблемкой. В регулярных выражениях пишу вот что: preg_match('/([А-Я])([а-я]+) ([А-Я])([а-я]+) ([А-Я])([а-я]+)/',$_POST['FIO'])!==1 Соответственно это рег. выражение берёт POST ст...

Вопрос № 114.192
Здравствуйте ув. эксперты. Помогите пожалуйста с такой вот проблемкой.
В регулярных выражениях пишу вот что:
preg_match('/([А-Я])([а-я]+) ([А-Я])([а-я]+) ([А-Я])([а-я]+)/',$_POST['FIO'])!==1
Соответственно это рег. выражение берёт POST строку и проверяет чтобы в ней было подряд 3 слова через пробел русскими буквами и каждое слово с большой буквы.

Но проблема в Ом, что это рег выражение проверяет только лишь наличие такой вот последовательности во всей строке. А мне нужно чтобы вся строка состояла только лишь из этого выражения и если в ней будет что-то ещё помимо этих 3-х слов, то нужно, чтобы возвращалось 0, а не 1. Другими словами нужно проверить чтобы в строке было только 3 слова русскими буквами через пробел и с большой буквы и ни символа более. Как это сделать?
Отправлен: 15.12.2007, 22:02
Вопрос задал: Стас Тельнов/[анти]КИЛЛЕР (статус: 4-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Товарищ Бородин
Здравствуйте, Стас Тельнов/[анти]КИЛЛЕР!
Надо попробовать установить ограничители строки - символы "^"(начало строки) и "$"(конец строки). Кроме того, Ваше регулярное выражение можно записать короче, если писать не "([А-Я])([а-я]+)", а "([А-Я+а-я*])". Плюс тут лишний, лучше поставить звездочку, указывая тем самым, что букв в слове может быть сколько угодно. Еще лучше, на мой взгляд, выражение такое:

"/([А-Яа-я]*s?){3}/". Это регулярное выражение не отслеживает, чтобы слова начинались с большой буквы, а также есть один недостаток - в конце строки может находиться пробел. Но это решается обработкой переменной $_POST['FIO'] функциями trim и ukwords. Первая режет пробелы по краям строки, вторая поднимает регистр первой буквы слова. На вход передается строка. Просто регулярные выражения - тема, которую мало кто понимает досконально, кроме того, они работают довольно медленно, в противоположность обычным функциям для работы со строками. Это просто совет и не более. А еще, по-моему, лучше будет сделать три отдельных поля под Ф, И и О.

Я поясню, почему такой совет. Пользователь не должен чувствовать себя как птица в клетке, у него должно быть право на ошибку. Вам только больше уважения, как программисту, будет со стороны наблюдательного пользователя, если Вы и без того не слишком-то грязную работу сделаете за него - всего один раз.
Не бойтесь нетривиальных, красивых решений. Кроме того, я советую пореже использовать регулярные выражения, особенно длинные. Нет никакой гарантии, что Вы не допустите ошибки в длинном выражении.
С уважением, Бородин Александр Олегович
---------
Ничто не сближает людей так, как совместное преступление.
Ответ отправил: Товарищ Бородин (статус: Студент)
Ответ отправлен: 15.12.2007, 22:32
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо, но в данном случае нет необходимости разделять ФИО на 3 переменные. А за совет по рег. выражениям большое спасибо, учту... просто мне кажется лучше использовать их, чем несколько идущих подряд if..elseif...elseif...

Отвечает: Миленин Александр
Здравствуйте, Стас Тельнов/[анти]КИЛЛЕР!
Вам нужно вначале поставить :^", а в конце "$": preg_match("/^([А-Я])([а-я]+) ([А-Я])([а-я]+) ([А-Я])([а-я]+)$/",$_POST['FIO'])!==1)

Если вам просто нужно проверить, лежат ли в переменной три слова подряд лучше воспользоваться таким рег.выром :

preg_match("/^[а-я]+ [а-я]+ [а-я]+$/i",$_POST['FIO'])...

Приложение:

Ответ отправил: Миленин Александр (статус: 8-ой класс)
Ответ отправлен: 15.12.2007, 22:35
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо. Не знал об символах начала и конца строки))

Отвечает: BerdArt
Здравствуйте, Стас Тельнов/[анти]КИЛЛЕР!
Для этого вам необходимо так изменить ваш запрос:
preg_match('/^([А-Я])([а-я]+) ([А-Я])([а-я]+) ([А-Я])([а-я]+)$/',$_POST['FIO'])!==1
^ - начало строки
$ - конец строки
Ответ отправил: BerdArt (статус: 3-ий класс)
Ответ отправлен: 20.12.2007, 20:56


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.65 от 04.12.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное