не работает проверка равенства

cmyk69

PHP:
  1.          $pr = bp_get_user_member_type($user_id);
  2. // 1.) echo $pr;
  3. // 2.) echo gettype($pr);
  4. // 3.) $pr=»Автор»;
  5.          if ($pr == ‘Автор’) {

Какой-то тупик в элементарном: После проверки не заходит в if () {…

bp_get_user_member_type () — по определению возвращает строку с типом пользователя.
В данном случае возвращается ‘Автор’ (проверял строкой 1.) кода.
Если сделать прямое присвоение, как в строке 3.), то вход в if нормальный.
На всякий случай проверил тип переменной — string, как и должно быть.

Заблудился в двух строчках:) Что у меня не так?
Как ещё можно проверить, что там такое на самом деле в этой $pr?

 

cmyk69

Попробовал проверить так:

PHP:
  1. var_dump ( $pr);
  2. var_dump ( ‘Автор’);

На выходе:

string(46) «Автор»
string(10) «Автор»

Это совсем выше моего понимания…

 

ADSoft

Внутренняя кодировка строки разная,
Во втором все понятно 2 байта на символ — utf8, а вот чтоб 46 байт занимало 5 символов…. странно, скорее всего присутствую непечатные символы…. типа пробелов, табуляции, перевод строки

ищите функцию, смотрите что внутри… попробуйте trim()

 

cmyk69

Там оказалась целая строка HTML.
Нашёл через

Код (Text):
  1. $pr=str_split($pr);
  2. 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

Проверку сделал через

PHP:
  1. if (!strpos ($pr, ‘Автор’)  && !strpos ($pr, ‘Ютубер’)) {
 

Дюран

1) Обычно все используют uft8 кодировку, для нее надо mb_strpos
2) Неверно использовать оператор !, т.к. strpos возвращает позицию нахождения, в т.ч. ноль

 

cmyk69

В нашем случае содержимое начинается со <span> (см. выше), так что «ноль» не актуально. Из этого я и исходил (неровно дышу к минимизации кода:)).

Честно говоря я совсем не въехал в разницу между mb_strpos() и простой strpos().
Буду признателен за разъяснение.

 

roboformation

mb_strpos () безопасна с точки зрения многобайтовых кодировок, а strpos() — нет

 

cmyk69

Прошу прощения — как это?
И насколько применимо к нашему конкретному случаю?

 

Дюран

Если вы глянете на внутряки этой функции, то там какие то фильтры есть и нет гарантии что она всегда будет спанами отдавать.
Ваш код не должен зависеть от таких скрытых данных, это вы просто пасхальные яйца в код вставляете.

 

roboformation

PHP:
  1. echo strpos(«e?ez»,‘?’).«<br>»; // 1
  2. echo strpos(«è?ent»,‘?’).«<br>»; // 2
  3. echo mb_strpos(«e?ez»,‘?’).«<br>»; // 1
  4. echo mb_strpos(«è?ent»,‘?’).«<br>»; // 1
 

roboformation

Если только проверять наличие подстроки в строке, то, я думаю, можно и просто strpos

 

cmyk69

Наверное, есть логика. Имеет смысл перестраховаться. Поправлю.
Спс!!!
— Добавлено —

Ух, ты! А почему здесь «2» получается?

 

ADSoft

да потому что при utf8 — 1 символ — 2 байта, два!
потому и говорят чтоб пользовались функциями mb_

 

cmyk69

И как это объясняет разницу в позиции вхождения вопросительного знака в приведённом случае:

PHP:
  1. echo strpos(«è?ent»,‘?’).«<br>»; // 2
  2. echo mb_strpos(«è?ent»,‘?’).«<br>»; // 1

?
И там и там он на втором месте. При чём здесь байты?

И ещё, из описания mb_strpos: «Выполняет безопасную с точки зрения многобайтных кодировок операцию strpos(), которая опирается на число символов в строке. Первый символ стоит на позиции 0, позиция второго 1 и так далее.»
Число символов, а не байт!!!
Совсем я запутался…

 

roboformation

Так это mb_strpos опирается на символы, а strpos опирается на байты. Так ‘è’ кодируется двумя байтами, т.е. занимает нулевой и первый байты, а ‘?’ — 2 байт по счету

 

cmyk69

Теперь разобрался!

Всем огромная благодарность за помощь!!!

 

artoodetoo

мелкие уточнения:

— символ в UTF-8 может занимать от 1 до 4 байт. все символы из набора ASCII в 1 байте, кириллица 2 байта, китайские иероглифы 4 байта

— всегда заглядывайте в исходный код страницы, если отлаживаете в браузере. или пробуйте проверить в текстовой консоли, потому что бывают еще HTML entities вроде &#x0410;&#x0432;&#x0442;&#x043e;&#x0440; который занимает 42 байта(!) а в браузере выглядит как Автор.

сравнивайте сравнимое, имейте в виду источник и подготавливайте данные соответсвенно

html_entity_decode , htmlentities

 

cmyk69

Очень познавательно. Уверен, что пригодится не только мне. Спс!!!

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *