При обрізанні рядка (substr) вилазять знаки питання

Люба х...ня

Часто при розробці проекту виникає потреба в обрізанні строки. Якщо використовувати кодування WINDOWS  проблем нема, а от якщо ми перейшли на UTF-8! Про це ми сьогодні і поговоримо.

Дуже часто я бачу сайти в яких в деяких блоках стоять знаки питання ?. Тільки не плутайте ? з ?  це зовсім різні речі. При використанні UTF-8 substr нам не підходить. Вона залишатиме щнаки питання. Потрібно використати аналог для UTF-8 mb_substr().

string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )

Рішення проблеми на реальному прикладі. Завдання: сформувати адреси відділень з можливістю сортування в по літерах. Сайт двомовний. Зрозуміло ніхто цього вручну робити не буде! Напишем парсер, заповнимо шаблон і внесемо на сайт. За приклад беремо адреси відділень нової пошти http://novaposhta.ua/frontend/brunchoffices. Над ним будемо і працювати. Логіка рішення: формуємо таблицю міст на відділень. В tr додаємо атрибут rel із значенням літери.

Шаблон:

    Авдіївка (Донецька область)


    відділ продажів
    (067)674-29-31

Код парсера на php

error_reporting(E_ALL);
ini_set('max_execution_time',3600);

$data='http://novaposhta.ua/frontend/brunchoffices/ru?alpha=all';
$data = urlencode(trim($data));

$doc = new DOMDocument();
@$doc->loadHTMLFile($data);
$out='';
foreach($doc->getElementsByTagName('td') as $items) {
    if($items->getAttribute('class') == 't-stdTblHeader') {
        $v = trim($items->nodeValue);
        $out .= '
        '. $v .'
            
                отдел продаж
                (067)674-29-31
            
        ';
    }
}
echo $out;

string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )

Результат можете переглянути тут

Розкажіть нам про свій проект!