【发布时间】:2011-10-11 17:15:19
【问题描述】:
当我将 Codeigniter 的 character_limiter() 与 PHP 的本机 strip_tags() 结合使用时,我得到了 � 字符。这是我正在使用的代码:
<?php echo character_limiter(strip_tags($block->body), 60); ?>
$block->body 是存储在数据库中的 HTML 字符串。如果我只使用其中一个功能,我不会得到这个意外的输出。它看起来像这样:
这就是 HTML 的样子:
我没有粘贴实际的 HTML,因为在此处发布字符串会被修改,见下文
这里是 Codeigniter 函数character_limiter:
function character_limiter($str, $n = 500, $end_char = '…')
{
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