Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Символьный класс

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: регистрозависим?
snikers987
Отправлено: 07 Апреля, 2012 - 14:19:01
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. $sStr = 'Зо0'; //буква, буква, ноль
  3. preg_match("#[\dзбвчоoib]+#i", $sStr, $rgMatches);
  4.  


Почему нет совпадений, если буквы в верхнем регистре? Если первый символ указать в нижнем регистре все работает, почему так?

(Отредактировано автором: 07 Апреля, 2012 - 14:21:41)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Мелкий Супермодератор
Отправлено: 07 Апреля, 2012 - 14:28:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




UTF8? Флаг u добавь.


-----
PostgreSQL DBA
 
 Top
snikers987
Отправлено: 07 Апреля, 2012 - 15:13:21
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




Мелкий пишет:
UTF8? Флаг u добавь.

нет, не юникод, windows-1251

(Отредактировано автором: 07 Апреля, 2012 - 15:14:05)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
snikers987
Отправлено: 08 Апреля, 2012 - 04:36:45
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




И все же, что не так?


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Alek
Отправлено: 08 Апреля, 2012 - 14:40:44
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Март 2011  
Откуда: Набережные Челны


Помог: 0 раз(а)




snikers987 пишет:
PHP:
скопировать код в буфер обмена
  1.  
  2. $sStr = 'Зо0'; //буква, буква, ноль
  3. preg_match("#[\dзбвчоoib]+#i", $sStr, $rgMatches);
  4.  


Почему нет совпадений, если буквы в верхнем регистре? Если первый символ указать в нижнем регистре все работает, почему так?

так, ты добавь в символьный класс буквы в верхнем регистре для рус. буквУлыбка
i - может вообще не работать с русскими символами Улыбка

(Отредактировано автором: 08 Апреля, 2012 - 14:44:56)

 
 Top
Okula
Отправлено: 08 Апреля, 2012 - 14:49:44
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Alek пишет:
i - может вообще не работать с русскими символами

Работает и с кирилицей. Может не работать, только если, кодировка юникод и отсутствует модификатор u.
Возможно стоит проверить в какой кодировке поступает текст в регулярное выражение.
 
 Top
snikers987
Отправлено: 08 Апреля, 2012 - 21:25:19
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




Okula если добавить модификатор u - ошибка. Кодировка 100% верная, иначе не находило бы и в нижнем регистре.
Alek Добавить верхний регистр это можно, но не ясно зачем его добавлять и почему i работает не как ожидалось.


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
LIME
Отправлено: 08 Апреля, 2012 - 21:28:37
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




я вот не уверен но....кажется модификатор i не распространяется на []
иначе к чему вот это? [а-яА-Я]
 
 Top
DeepVarvar Супермодератор
Отправлено: 08 Апреля, 2012 - 21:54:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Мне кажется все проще.
По умолчанию ожидается нижний регистр [а-яё],
но если указан верхний [АЯ-Ё], то "умолчание" отсекается как не нужное.
Поэтому модификатор i уместным будет применять только при описании класса символов в нижнем регистре.
Хотя я не проверял наверняка, но судя из того что происходит, все может быть именно так.
Кроме того существуют различные версии PCRE,
которые могут по разному (с разным приоритетом) интерпретировать те или иные модификаторы.
Соответственно лучше написать [а-яёА-ЯЁ] и точно знать что проканает в любом случае.
 
 Top
Alek
Отправлено: 08 Апреля, 2012 - 23:57:34
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Март 2011  
Откуда: Набережные Челны


Помог: 0 раз(а)




твой пример у меня работает без проблем...Да, скорее всего DeepVarvar в общем прав
snikers987 пишет:

Alek Добавить верхний регистр это можно, но не ясно зачем его добавлять и почему i работает не как ожидалось.

чтоб получить корректный результат...

(Отредактировано автором: 09 Апреля, 2012 - 00:25:09)

 
 Top
LIME
Отправлено: 09 Апреля, 2012 - 00:05:21
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




DeepVarvar Alek в том то и дело что менялся регистр не в регулярке а в строке
значит нет никакого умолчания
тупо i не пашет
 
 Top
DeepVarvar Супермодератор
Отправлено: 09 Апреля, 2012 - 00:09:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Ну вот для cp1251 и не пашет, а для utf-8 вдруг бац и пашет...
Реализации то разные, и чармапы в исходниках к ним разные, и алгоритмы тоже разные.
А если еще вспомнить что винде плевать на регистр,
то появляется мысль что для cp1251 PCRE на регистр тоже плевать, точнее не работает он совсем...
(Добавление)
Ну вот так и есть:
cp1251:

Результат:
CODE (htmlphp):
скопировать код в буфер обмена
  1. array(1) { [0]=>  array(1) { [0]=>  string(1) "т" } }

utf-8:

Результат:
CODE (htmlphp):
скопировать код в буфер обмена
  1. array(1) { [0]=>  array(2) { [0]=>  string(2) "Т" [1]=>  string(2) "т" } }
 
 Top
snikers987
Отправлено: 09 Апреля, 2012 - 22:19:26
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




DeepVarvar И все же, кодировка - это не оправдание, а баг. имхо Хм
Во всяком случаи, данная особенность не задокументирована.

(Отредактировано автором: 09 Апреля, 2012 - 22:20:23)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB