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
Форумы портала PHP.SU :: Версия для печати :: Символьный класс
Форумы портала PHP.SU » PHP » Регулярные выражения » Символьный класс

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

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


Почему нет совпадений, если буквы в верхнем регистре? Если первый символ указать в нижнем регистре все работает, почему так?
2. Мелкий - 07 Апреля, 2012 - 14:28:28 - перейти к сообщению
UTF8? Флаг u добавь.
3. snikers987 - 07 Апреля, 2012 - 15:13:21 - перейти к сообщению
Мелкий пишет:
UTF8? Флаг u добавь.

нет, не юникод, windows-1251
4. snikers987 - 08 Апреля, 2012 - 04:36:45 - перейти к сообщению
И все же, что не так?
5. Alek - 08 Апреля, 2012 - 14:40:44 - перейти к сообщению
snikers987 пишет:
PHP:
скопировать код в буфер обмена
  1.  
  2. $sStr = 'Зо0'; //буква, буква, ноль
  3. preg_match("#[\dзбвчоoib]+#i", $sStr, $rgMatches);
  4.  


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

так, ты добавь в символьный класс буквы в верхнем регистре для рус. буквУлыбка
i - может вообще не работать с русскими символами Улыбка
6. Okula - 08 Апреля, 2012 - 14:49:44 - перейти к сообщению
Alek пишет:
i - может вообще не работать с русскими символами

Работает и с кирилицей. Может не работать, только если, кодировка юникод и отсутствует модификатор u.
Возможно стоит проверить в какой кодировке поступает текст в регулярное выражение.
7. snikers987 - 08 Апреля, 2012 - 21:25:19 - перейти к сообщению
Okula если добавить модификатор u - ошибка. Кодировка 100% верная, иначе не находило бы и в нижнем регистре.
Alek Добавить верхний регистр это можно, но не ясно зачем его добавлять и почему i работает не как ожидалось.
8. LIME - 08 Апреля, 2012 - 21:28:37 - перейти к сообщению
я вот не уверен но....кажется модификатор i не распространяется на []
иначе к чему вот это? [а-яА-Я]
9. DeepVarvar - 08 Апреля, 2012 - 21:54:18 - перейти к сообщению
Мне кажется все проще.
По умолчанию ожидается нижний регистр [а-яё],
но если указан верхний [АЯ-Ё], то "умолчание" отсекается как не нужное.
Поэтому модификатор i уместным будет применять только при описании класса символов в нижнем регистре.
Хотя я не проверял наверняка, но судя из того что происходит, все может быть именно так.
Кроме того существуют различные версии PCRE,
которые могут по разному (с разным приоритетом) интерпретировать те или иные модификаторы.
Соответственно лучше написать [а-яёА-ЯЁ] и точно знать что проканает в любом случае.
10. Alek - 08 Апреля, 2012 - 23:57:34 - перейти к сообщению
твой пример у меня работает без проблем...Да, скорее всего DeepVarvar в общем прав
snikers987 пишет:

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

чтоб получить корректный результат...
11. LIME - 09 Апреля, 2012 - 00:05:21 - перейти к сообщению
DeepVarvar Alek в том то и дело что менялся регистр не в регулярке а в строке
значит нет никакого умолчания
тупо i не пашет
12. DeepVarvar - 09 Апреля, 2012 - 00:09:56 - перейти к сообщению
Ну вот для cp1251 и не пашет, а для utf-8 вдруг бац и пашет...
Реализации то разные, и чармапы в исходниках к ним разные, и алгоритмы тоже разные.
А если еще вспомнить что винде плевать на регистр,
то появляется мысль что для cp1251 PCRE на регистр тоже плевать, точнее не работает он совсем...
(Добавление)
Ну вот так и есть:
cp1251:

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

utf-8:
PHP:
скопировать код в буфер обмена
  1. $a = "Тест";
  2. preg_match_all("/[т]+/iu", $a, $m);

Результат:
CODE (htmlphp):
скопировать код в буфер обмена
  1. array(1) { [0]=>  array(2) { [0]=>  string(2) "Т" [1]=>  string(2) "т" } }
13. snikers987 - 09 Апреля, 2012 - 22:19:26 - перейти к сообщению
DeepVarvar И все же, кодировка - это не оправдание, а баг. имхо Хм
Во всяком случаи, данная особенность не задокументирована.

 

Powered by ExBB FM 1.0 RC1