【问题标题】:� appears using character_limiter() with strip_tags() and utf-8 charset� 使用 character_limiter() 和 strip_tags() 和 utf-8 字符集出现
【发布时间】:2011-10-11 17:15:19
【问题描述】:

当我将 Codeigniter 的 character_limiter() 与 PHP 的本机 strip_tags() 结合使用时,我得到了 � 字符。这是我正在使用的代码:

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

$block-&gt;body 是存储在数据库中的 HTML 字符串。如果我只使用其中一个功能,我不会得到这个意外的输出。它看起来像这样:

这就是 HTML 的样子:

我没有粘贴实际的 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 中)时,没有任何改变。

当一起使用时,我无法连接这两个函数之间的点,导致此输出,并且我没有正常获取 � 字符。我在我使用时看到此输出:

character_limiter(strip_tags($html))

什么可能导致这种情况,我该如何预防?

注意:我肯定想使用character_limiter 函数,或者它的变体。如果字符串的长度比第二个参数长,它会在字符串的末尾添加一个省略号。单独使用它(没有strip_tags)效果很好(没有奇怪的字符)。

更新:对于无法重现此问题的任何人,我将一个 SQL 文件放到网上来演示该问题。我正在使用MySQL Query Browser 导入它。当 HTML 来自数据库时,我只得到它 似乎 的输出。这是链接(忽略内容,是客户的错):http://wesleymurch.com/test/test1.sql

【问题讨论】:

  • 我刚刚尝试了您的代码,但无法重现该问题;试过utf-8和ansi,一样。唯一的区别是我的 html 字符串是硬编码的,然后没有数据库。真的不知道是不是真的是两个函数的混合,我不明白为什么他们可以输出那个字符......
  • 是的,我知道这很难测试,但我向您保证它确实发生了,让我看看我是否可以使用实际字符串在线获取文件...编辑:不知道如何在不“删除”隐形字符的情况下做到这一点,有什么想法吗?此外,这是我第一次看到这种情况,只是在从旧网站导入数据后发生的。
  • 我不知道,我搜索了 strip_tags() 函数中的错误,但没有发现任何相关的......特别是如果你说这只是这个顺序的两者的组合(如果你改变它? strip_tags(character_limiter...)) 给出了问题。
  • 我将一个 SQL 文件放到网上,希望可以帮助重现该问题,我对其进行了测试,它对我有用。 @DamienPirsy:如果我颠倒顺序,输出就OK了。
  • 看到你很解决id。无论如何,使用新的数据库,Xampp Windows 下的 phpmyadmin 不会出现问题。

标签: php codeigniter character-encoding


【解决方案1】:

� 用于替换未知或不可打印字符的替换字符 在 php 中,我们通常使用多字节字符串函数来解决这个问题。 将 mb_substr 与带状标签一起使用:

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

或者您可能会修改 codeigniter 函数并使用 Multibyte String Functions 。

更新

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;
        }
    }
}

【讨论】:

  • 恐怕没有用。这是我的代码的复制粘贴:character_limiter(mb_substr(strip_tags($block-&gt;body), 0, 300, 'UTF-8' ), 60); 此外,如果字符串比参数长,我想使用character_limiter() 函数来利用省略号。
  • 不要在没有字符限制的情况下使用它,例如mb_substr(strip_tags($block-&gt;body), 0, 60, 'UTF-8' );
  • 是的,结果完全相同。这很奇怪。我希望我可以在键盘上演示它,但它不会出现。你明白我为什么要使用character_limiter()吗?这就是这篇文章的重点,除非我将这两个函数结合起来,否则我不会得到那个输出,而且任何一个都可以。
  • 尝试评论(删除)$str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
  • 哦,原来是那个??但为什么?为什么只与 strip_tags() 一起使用? :-o
猜你喜欢
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2012-07-11
  • 2014-06-26
相关资源
最近更新 更多