nipopadyuk
@nipopadyuk

Почему при использовании substr в php, если в тексте есть символ точки, то он считает не корректно?

Доброго дня.

Есть переменная, из которой нужно вытащить последние 3 символа, и сравнить их.
Функцию сделал такую:
$item_name_3 = substr($item_name, -3);

Целевые значения для меня, это значения похожие на эти: ".Р1", ".Р2", и т.д.
Важным является именно наличие точки как третий символ с конца строки (отслеживаем версии, ревизии, так в общем по ГОСТу маркируют их)

Когда попадается нецелвая строка, которая заканчивается без доп.версии, просто номером документа, например "ДокРу00001"(начало может быть вообще рандом, бывают документы от 8 до 17 символов в маркировке), то все ок, возвращается "001", но когда попадается целевая строка, например, "ДокРу00001.Р1", то возвращается только "Р1", без точки.

Может это фишка какая-то с точкой и существует другой способ вытащить последние три символа?

П.С.
Можно было бы и без точки сравнивать, но мы столкнулись с другой проблемой, некоторые маркируют неравильно, и не используют точку, получается документ вида "ДокРу00001Р1", и для обработки таких документов, мы сделали отдельную точно такую же функцию, но которая обрабатывает последние два символа, а не три.
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
substr работает не с символами, а с байтами. Для многобайтовых кодировок, где один символ может представляться несколькими байтами (кириллица в UTF-8 - два байта на символ) надо использовать библиотеку mbstring. Соответственно, substr заменяется на mb_substr.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
vovka3003
@vovka3003
Фрилансер. Инженер систем безопасности.
А если попробовать mb_substr?
Ответ написан
Комментировать
@alexalexes
"ДокРу00001.Р1"

Вероятно, у вас эта строка не в однобайтовой кодировке (скорее всего в utf8 работаете).
Для таких строк нужно использовать набор функций для строк в многобайтовых кодировках, в данном случае вам нужна функция mb_substr вместо substr, иначе результат работы функций для однобайтовых кодировок в строках с многобайтовыми - не предсказуем.

PS: не забудьте включить расширение mb_string в конфиге php сервера.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
18 апр. 2024, в 07:58
500 руб./в час
18 апр. 2024, в 07:22
45000 руб./за проект
18 апр. 2024, в 01:12
150000 руб./за проект