strpos, sripos, mb_strpos, mb_stripos, preg_match — неверно работают в utf-8

govnoproger.ru > php > strpos, sripos, mb_strpos, mb_stripos, preg_match — неверно работают в utf-8

Вчера наступил на старые грабли функций strpos, sripos, mb_strpos, mb_stripos, preg_match. Все они неверно работают в utf8 на php 5.2 или 5.3 (непомню точную версию).

Валялся у меня текстовик — после анализа файн ридера. Решил сделать так чтобы сайт автоматически наполнял себя из него контентом. Суть вот в чем:

Содержание текстовика

НАЙДИ МЕНЯ
текст текст текст текст текст текст текст текст текст текст текст текст текст 
текст текст текст текст текст текст текст текст текст текст текст текст текст 
текст текст текст текст текст текст текст текст текст текст текст текст текст 
текст текст текст текст текст текст текст текст текст 


Тут понятно ищет по заглавию НАЙДИ МЕНЯ.
Открыл текстовик, запихнул в массив

$f = fopen($fname = "content.txt", "r+t");
$lines = explode("\n", fread($f, filesize($fname)));

Дальше заметил что не находит НАЙДИ МЕНЯ. Перепробывал strpos, sripos, mb_strpos, mb_stripos, preg_match. Вернее находит но не там где нужно! У меня notepad++ нашел сразу в нужном заглавии.

В итоге использовал функцию preg_match_all — она как раз-таки и работала как я и ожидал. Медленный вариант, но как говорил Бер Грилз — лучше чем ничего.

Я не утверждаю что они всегда неверно работают, но реально есть случаи когда просто не находят.
Кстати прошу заметить после fine reader — текст вперемешку с хз какими символами.

Рекомендую:

21.11.2010 | последняя редакция: 21.11.2010 |
  1. ZyXEL
    5.12.2010 в 17:49

    по поводу mb_* функций:
    http://www.php.net/manual/en/function.mb-stripos.php

    int mb_stripos ( string $haystack , string $needle [, int $offset [, string $encoding ]] )
    

    от «хз каких» символов после файн-ридера чистимся так:

    $str=iconv("cp1251", "cp1251//IGNORE", $keywords[$zz]);
    
  2. У меня нет хз каких символов и всё равно не правильно работают те функции