PCRE

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
Maximilian
Сообщения: 52
Зарегистрирован: 2010.02.12, 00:36
Откуда: Днепропетровск

PCRE

Сообщение Maximilian »

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

- Киев, Воронеж, Москва (одиночное название);
- Нижний Новгород, Нижний Тагил (составное с пробелом);
- Нью-Йорк, Санкт-Петербург, Тель-Авив, Сан-Хосе, Усть-Каменогорск (составное с дефисом);
- Рио-де-Житомир, Карл-Маркс-Штадт, Порт-о-Пренс (составное с двумя дефисами);

и занести его в public function rules() (в таком плане):

Код: Выделить всё

  array('location','match','pattern'=>'/^[A-Za-z]+$/u','message'=>Yii::t("user","Incorrect symbol's. (A-z)")),
 
Составил такое регулярное выражение:

Код: Выделить всё

/^[А-Яа-я]+-?[А-Яа-я]+-?[А-Яа-я]+|[А-Яа-я]+s?[А-Яа-я]+|[А-Яа-я]+$/u
Перед s - обратная косая, вытирает ее...

1. Нормально ли в таком виде? Потом уже средствами PHP перевести в нижний регистр (strtolower($st)) все название
(если вводят САНКТ_ПЕТЕРБУРГ, СаНкТ-ПеТерБург или поставить /ui) и установить большие буквы - первую, после пробела или дефиса
(думаю, что в Порт-о-Пренсе простят за заглавную "О").
2. В случае ввода пробельных симолов табуляции или перевода строки вместо " ", как бороться?
3. Конечно, победить ввод 'Санкт Петербург' скорее всего не получится... Не перебирать же все...
4. Не получится ввести название типа Лонг-О (потребует два символа после дефиса, тогда добавить еще вариант [А-Яа-я]+-?[А-Яа-я]+).
5. Справится Yii с таким набором (по идее должен, это же PHP)? Тем более, если нужно добавить отдельно конструкции [A-Za-z]+, чтобы
название вводили либо русскими, либо английскими, но не вперемешку...

Конечный вариант:

Код: Выделить всё

/^[А-Яа-я]+-?[А-Яа-я]+-?[А-Яа-я]+|[А-Яа-я]+-?[А-Яа-я]+|[А-Яа-я]+s?[А-Яа-я]+|[А-Яа-я]+$/ui
Сейчас попытаюсь переложить для utf-8...
Требования террористов о выкупе выполнены: террористы выкупаны и уложены баиньки :)
Аватара пользователя
Maximilian
Сообщения: 52
Зарегистрирован: 2010.02.12, 00:36
Откуда: Днепропетровск

Re: PCRE

Сообщение Maximilian »

Посмотрел viewtopic.php?f=4&t=210 и ссылку на PCRE на сайте PHP,
но понял, что \p{L} - это любые буквенные символы.

1. А как выделить русские буквы отдельно, английские и другую специфику (вроде тега «Nürnberg») отдельно.
Только для русских символов использовать паттерн /^[\x{0400}-\x{04FF}]+/ui? А для остальных?
2. \p{Zs} - это только пробел или табуляция, перенос строки и возврат каретки тоже?

Короче говоря, как пример в предыдущем сообщении переложить правильно на формат utf-8 и отдельно добавить
ввод не русских символов?
Требования террористов о выкупе выполнены: террористы выкупаны и уложены баиньки :)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: PCRE

Сообщение samdark »

1. Для английских [a-zA-Z].

[\x{0400}-\x{04FF}] — это диапазон символов Unicode. Подробнее почитать про них и выбрать нужный можно тут: http://www.unicode.org/.

2. \p{Z} — это все разделители. Про это написано тут: http://ru2.php.net/manual/en/regexp.ref ... nicode.php.

Я бы проверил так:

Код: Выделить всё

~^([-x{0400}-x{04FF}]|p{Zs})+$~ui
Аватара пользователя
Maximilian
Сообщения: 52
Зарегистрирован: 2010.02.12, 00:36
Откуда: Днепропетровск

Re: PCRE

Сообщение Maximilian »

Спасибо, проверю вариант, почитаю ссылки. А английские что utf-8, что для cp1251 выглядят одинаково,
насколько я понял. Сам вариант, который я написал, жизнеспособен, если вместо русских поставить английские символы?
Требования террористов о выкупе выполнены: террористы выкупаны и уложены баиньки :)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: PCRE

Сообщение samdark »

Длинноват вариант для такой проверки. По-моему чрезмерно мощные правила.
Аватара пользователя
Maximilian
Сообщения: 52
Зарегистрирован: 2010.02.12, 00:36
Откуда: Днепропетровск

Re: PCRE

Сообщение Maximilian »

Вот это и беспокоит. Варианты, которые нужны, вроде бы перебирает нормально - не будет первого и последнего дефиса,
не будет названия, состоящего из одного или двух дефисов (и тем паче большего количества), но длина смущает.
А в виде для UTF-8 (только русские символы) еще больше...
Требования террористов о выкупе выполнены: террористы выкупаны и уложены баиньки :)
Ответить