当我将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
答案 0 :(得分:1)
替换字符用于替换未知或不可打印的字符 在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 = '…')
{
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;
}
}
}