cmyk69
PHP:
$pr = bp_get_user_member_type($user_id); // 1.) echo $pr; // 2.) echo gettype($pr); // 3.) $pr=»Автор»; if ($pr == ‘Автор’) {Какой-то тупик в элементарном: После проверки не заходит в if () {…
bp_get_user_member_type () — по определению возвращает строку с типом пользователя.
В данном случае возвращается ‘Автор’ (проверял строкой 1.) кода.
Если сделать прямое присвоение, как в строке 3.), то вход в if нормальный.
На всякий случай проверил тип переменной — string, как и должно быть.Заблудился в двух строчках Что у меня не так?
Как ещё можно проверить, что там такое на самом деле в этой $pr?
cmyk69
Попробовал проверить так:
На выходе:
string(46) «Автор»
string(10) «Автор»Это совсем выше моего понимания…
ADSoft
Внутренняя кодировка строки разная,
Во втором все понятно 2 байта на символ — utf8, а вот чтоб 46 байт занимало 5 символов…. странно, скорее всего присутствую непечатные символы…. типа пробелов, табуляции, перевод строкиищите функцию, смотрите что внутри… попробуйте trim()
cmyk69
Там оказалась целая строка HTML.
Нашёл черезКод (Text):
$pr=str_split($pr); print_r ($pr);На выводе:
Array ( [0] => < [1] => s [2] => p [3] => a [4] => n [5] => [6] => c [7] => l [8] => a [9] => s [10] => s [11] => = [12] => » [13] => b [14] => p [15] => — [16] => m [17] => e [18] => m [19] => b [20] => e [21] => r [22] => — [23] => t [24] => y [25] => p [26] => e [27] => » [28] => > [29] => � [30] => � [31] => � [32] => � [33] => � [34] => � [35] => � [36] => � [37] => � [38] => � [39] => < [40] => / [41] => s [42] => p [43] => a [44] => n [45] => > )
Благодарю за помощь!
cmyk69
Проверку сделал через
Дюран
1) Обычно все используют uft8 кодировку, для нее надо mb_strpos
2) Неверно использовать оператор !, т.к. strpos возвращает позицию нахождения, в т.ч. ноль
cmyk69
В нашем случае содержимое начинается со <span> (см. выше), так что «ноль» не актуально. Из этого я и исходил (неровно дышу к минимизации кода).
Честно говоря я совсем не въехал в разницу между mb_strpos() и простой strpos().
Буду признателен за разъяснение.
roboformation
mb_strpos () безопасна с точки зрения многобайтовых кодировок, а strpos() — нет
cmyk69
Прошу прощения — как это?
И насколько применимо к нашему конкретному случаю?
Дюран
Если вы глянете на внутряки этой функции, то там какие то фильтры есть и нет гарантии что она всегда будет спанами отдавать.
Ваш код не должен зависеть от таких скрытых данных, это вы просто пасхальные яйца в код вставляете.
roboformation
PHP:
roboformation
Если только проверять наличие подстроки в строке, то, я думаю, можно и просто strpos
cmyk69
Наверное, есть логика. Имеет смысл перестраховаться. Поправлю.
Спс!!!
— Добавлено —Ух, ты! А почему здесь «2» получается?
ADSoft
да потому что при utf8 — 1 символ — 2 байта, два!
потому и говорят чтоб пользовались функциями mb_
cmyk69
И как это объясняет разницу в позиции вхождения вопросительного знака в приведённом случае:
?
И там и там он на втором месте. При чём здесь байты?И ещё, из описания mb_strpos: «Выполняет безопасную с точки зрения многобайтных кодировок операцию strpos(), которая опирается на число символов в строке. Первый символ стоит на позиции 0, позиция второго 1 и так далее.»
Число символов, а не байт!!!
Совсем я запутался…
roboformation
Так это mb_strpos опирается на символы, а strpos опирается на байты. Так ‘è’ кодируется двумя байтами, т.е. занимает нулевой и первый байты, а ‘?’ — 2 байт по счету
cmyk69
Теперь разобрался!
Всем огромная благодарность за помощь!!!
artoodetoo
мелкие уточнения:
— символ в UTF-8 может занимать от 1 до 4 байт. все символы из набора ASCII в 1 байте, кириллица 2 байта, китайские иероглифы 4 байта
— всегда заглядывайте в исходный код страницы, если отлаживаете в браузере. или пробуйте проверить в текстовой консоли, потому что бывают еще HTML entities вроде Автор который занимает 42 байта(!) а в браузере выглядит как Автор.
сравнивайте сравнимое, имейте в виду источник и подготавливайте данные соответсвенно
html_entity_decode , htmlentities
cmyk69
Очень познавательно. Уверен, что пригодится не только мне. Спс!!!