появляется с помощью character_limiter () с strip_tags () и кодировкой utf-8 - PullRequest
4 голосов
/ 11 октября 2011

Я получаю � символов, когда объединяю Codeigniter character_limiter() с нативным PHP 100 *.Вот код, который я использую:

<?php echo character_limiter(strip_tags($block->body), 60); ?>

$block->body - строка HTML, хранящаяся в базе данных.Я не получаю этот неожиданный вывод, если я использую только одну из функций.Это выглядит так:

enter image description here

Вот как выглядит HTML:

enter image description here

Я не сделалвставьте фактический HTML, потому что строка будет изменена путем публикации здесь, см. ниже

Вот функция Codeigniter character_limiter:

function character_limiter($str, $n = 500, $end_char = '&#8230;')
{
    if (strlen($str) < $n)
    {
        return $str;
    }

    $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));

    if (strlen($str) <= $n)
    {
        return $str;
    }

    $out = "";
    foreach (explode(' ', trim($str)) as $val)
    {
        $out .= $val.' ';

        if (strlen($out) >= $n)
        {
            $out = trim($out);
            return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
        }
    }
}

Я понял, что там былокакой-то невидимый символ или что-то, что могло быть причиной этого, потому что, когда я вставил HTML-код в текстовый редактор, затем снова в «редактор исходного кода HTML» на изображении (это просто TinyMCE), а затем сохранил его, странные символы исчезли.

Я использую набор символов utf-8 по всей доске (везде, где это возможно).Исходные данные поступили из дампа неизвестной базы данных и были импортированы с клиентом SQL.Однако, когда я сохранил существующую строку (в CMS), ничего не изменилось.

Я не могу соединить точки между этими двумя функциями, вызывая этот вывод при совместном использовании, а я не получите символы normally как обычно.Я только вижу этот вывод при использовании:

character_limiter(strip_tags($html))

Что может быть причиной, и как я могу предотвратить это?

Примечание: Я определенно хочу использовать функцию character_limiter или ее вариант.Это делает многоточие в конце строки, если его длина больше, чем второй параметр.Использование одного (без strip_tags) прекрасно работает (без странных символов).

Обновление: Для тех, кто не может воспроизвести это, я разместил в сети файл SQL, который демонстрируетвопрос.Я импортирую это с MySQL Query Browser .Я получаю только этот вывод кажется , когда HTML поступает из базы данных.Вот ссылка (игнорируйте контент, это вина клиента): http://wesleymurch.com/test/test1.sql

1 Ответ

1 голос
/ 11 октября 2011

� символ замены, используемый для замены неизвестного или непечатаемого символа в php. Обычно мы решаем эту проблему, используя многобайтовые строковые функции.используйте mb_substr с тегами полосы, такими как:

mb_substr( strip_tags($text) , 0,300 ,'UTF-8' );//or what ever your charset 

, или вы можете изменить функцию codeigniter и использовать многобайтовые строковые функции.

ОБНОВЛЕНИЕ

function character_limiter($str, $n = 500, $end_char = '&#8230;')
{
    if (mb_strlen($str) < $n)
    {
        return $str;
    }

    $str = mb_ereg_replace("\s+", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));

    if (mb_strlen($str) <= $n)
    {
        return $str;
    }

    $out = "";
    foreach (explode(' ', trim($str)) as $val)
    {
        $out .= $val.' ';

        if (mb_strlen($out) >= $n)
        {
            $out = trim($out);
            return (mb_strlen($out) == mb_strlen($str)) ? $out : $out.$end_char;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...