Проблема с preg_match

Рейтинг: 0Ответов: 2Опубликовано: 28.09.2014

Всем привет!
В общем, простой код:

  $domain = 'сайт.рф';
  if(@preg_match("/^[0-9a-zа-я-.]+\.[0-9a-zа-я-]{2,6}$/u", $domain))
   {
    $enter = true;
   }
  else
   {
    $enter = false;
   } // возвращает true

  $domain = 'сайт.рф';
  if(@preg_match("/^[0-9a-zа-я-.]+\.[0-9a-zа-я-]{2,6}$/u", $domain) && @preg_match("/^[0-9a-zа-я]$/u", $domain[0]))
   {
    $enter = true;
   }
  else
   {
    $enter = false;
   } // возвращает false

Не понимаю, почему во втором варианте віходит false.

Ответы

▲ 1

Потому что Unicode это двух(четырех)байтовая кодировка (в Вашем случае двух-), а обращение

$unicode[$x]

вернет один байт, который, естественно, не является буквой. Используйте функции для работы с Unicode или перепишите регулярное выражение на такое, которое заменит два условия одним выражением:

/^[0-9a-zа-я][0-9a-zа-я-.]*\.[0-9a-zа-я-]{2,6}$/u

или:

/^(?![-.])[0-9a-zа-я-.]+\.[0-9a-zа-я-]{2,6}$/u
▲ 0

В первом условии у вас проверяется переменная $domain

preg_match("/^[0-9a-zа-я-.]+\.[0-9a-zа-я-]{2,6}$/u"

которая содержит до точки буквы, цифры, дефис и точку, а после точки от 2 до 6 цифр, букв или дефисов. Условие задано некорректно, дефис и точку надо отделять обратным слэшем, т.е.

 preg_match("/^[0-9a-zа-я\-\.]+\.[0-9a-zа-я\-]{2,6}$/u"

Во втором случае вы пытаетесь проверить переменную как массив, что приводит к ошибке и выполняется условие иначе (else)

&& @preg_match("/^[0-9a-zа-я]$/u", $domain[0])

$domain[0] не является массивом. Уберите все @ в условии перед preg_match, не надо глушить вывод ошибок, вам же это и мешает при отладке.