проблемы с заглавными буквами.
Модератор: Duncon
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
Ребята, у вас кофе ещё не закончился? 
Закономерность:
1. в сообщении нет ни одного латинского символа в нижнем регистре
2. длина эффективного сообщения (буквы, цифры и пробельные символы) больше 13-ти символов
Почему? Смотрим исходники этих умников из Jelsoft_a :
[syntax="php"]// ###################### Start stopshouting #######################
function fetch_no_shouting_text($text)
{
// ... cut
// we only actually touch a-z with vbstrtolower()
$effective_string = preg_replace('#[^a-z0-9\s]#i', '', $text);
// ... cut
if ($vbulletin->options['stopshouting'] AND vbstrlen($effective_string) >= $vbulletin->options['stopshouting'] AND $effective_string == strtoupper($effective_string))
{
return vbucwords(vbstrtolower($text));
}
// ... cut[/syntax]
Первым делом вырезаются все символы, кроме латинских букв, цифр и пробельных символов, так что всё остальное вообще никак на проблему не влияет,
а далее проверяется включена ли в форуме опция принудительного "отключения" КАПС-ЛОК, причём опция эта проверяется только начиная с заданной длины сообщения.
Почему 13 ? Наверное Aik так поставил.
Почему я решил, что 13 ?
Смотрим на два сообщения от BBB :
. Абвг дежзикл
. абвг дежз икл
Разница всего лишь в одном пробеле и уже не работает.
Так же это обьясняет, почему тест от Хыиуду тоже сработал нормально.
(
реально может быть не 13, а 52,
но для кириллицы должно быть 13.
52 может быть потому, что кирилличная буква представляется как а
и после "обрезания" получается в 4-ре раза "толще"
)
Остальные же тесты, написанные в этой теме, срабатывают потому, что в них был хотя бы один латинский символ в нижнем регистре.
Поскольку если такового нет, то последний предикат условия вырождается в :
"123 456" == strtoupper("123 456")
что есть всегда TRUE
Ну и далее происходит нечто забавное ))
vbstrtolower - это локализированная ф-ция, которая действительно преобразует и кирилличные буквы в нижний регистр,
а вот vbucwords - нет
[syntax="php"]/**
* Capitalizes the first letter of each word, provided it is within a-z.
* Ignores locales.
*/
function vbucwords($text) {
// ... cut[/syntax]
----------------------
Вот такие вот дела, ребятушки.
Так что, Уважаемые Админы, вырубите нафик, пожалуйста, эту опцию
Всё равно она не спасёт от сообщения: HHHHHHHHHHHHHHHHHHHHHHelp !!!!!

Закономерность:
1. в сообщении нет ни одного латинского символа в нижнем регистре
2. длина эффективного сообщения (буквы, цифры и пробельные символы) больше 13-ти символов
Почему? Смотрим исходники этих умников из Jelsoft_a :
[syntax="php"]// ###################### Start stopshouting #######################
function fetch_no_shouting_text($text)
{
// ... cut
// we only actually touch a-z with vbstrtolower()
$effective_string = preg_replace('#[^a-z0-9\s]#i', '', $text);
// ... cut
if ($vbulletin->options['stopshouting'] AND vbstrlen($effective_string) >= $vbulletin->options['stopshouting'] AND $effective_string == strtoupper($effective_string))
{
return vbucwords(vbstrtolower($text));
}
// ... cut[/syntax]
Первым делом вырезаются все символы, кроме латинских букв, цифр и пробельных символов, так что всё остальное вообще никак на проблему не влияет,
а далее проверяется включена ли в форуме опция принудительного "отключения" КАПС-ЛОК, причём опция эта проверяется только начиная с заданной длины сообщения.
Почему 13 ? Наверное Aik так поставил.
Почему я решил, что 13 ?
Смотрим на два сообщения от BBB :
. Абвг дежзикл
. абвг дежз икл
Разница всего лишь в одном пробеле и уже не работает.
Так же это обьясняет, почему тест от Хыиуду тоже сработал нормально.
(
реально может быть не 13, а 52,
но для кириллицы должно быть 13.
52 может быть потому, что кирилличная буква представляется как а
и после "обрезания" получается в 4-ре раза "толще"
)
Остальные же тесты, написанные в этой теме, срабатывают потому, что в них был хотя бы один латинский символ в нижнем регистре.
Поскольку если такового нет, то последний предикат условия вырождается в :
"123 456" == strtoupper("123 456")
что есть всегда TRUE
Ну и далее происходит нечто забавное ))
vbstrtolower - это локализированная ф-ция, которая действительно преобразует и кирилличные буквы в нижний регистр,
а вот vbucwords - нет

[syntax="php"]/**
* Capitalizes the first letter of each word, provided it is within a-z.
* Ignores locales.
*/
function vbucwords($text) {
// ... cut[/syntax]
----------------------
Вот такие вот дела, ребятушки.
Так что, Уважаемые Админы, вырубите нафик, пожалуйста, эту опцию

Всё равно она не спасёт от сообщения: HHHHHHHHHHHHHHHHHHHHHHelp !!!!!
Ну без сорцов конечно никак, thanks 2 Oscar за проявленую инициативу
It's a long way to the top if you wanna rock'n'roll