一般网站页面的显示都不可避免的会涉及子字符串的截取,这个时候truncate就派上用场了,但是它只适合英文用户,对与中文用户来说,使用
truncate会出现乱码,而且对于中文英文混合串来说,截取同样个数的字符串,实际显示长度上却不同,视觉上会显得参差不齐,影像美观。这是因为一个
中文的长度大致相当与两个英文的长度。此外,truncate也不能同时兼容GB2312, UTF-8等编码。
改良的smartTruncate: 文件名:modifier.smartTruncate.php
<?php
function smartDetectUTF8($string)
{
static $result = array();
if(! array_key_exists($key = md5($string), $result))
{
$utf8 = "
/^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)+$/xs
";
$result[$key] = preg_match(trim($utf8), $string);
}
return $result[$key];
}
function smartStrlen($string)
{
$result = 0;
$number = smartDetectUTF8($string) ? 3 : 2;
for($i = 0; $i < strlen($string); $i += $bytes)
{
$bytes = ord(substr($string, $i, 1)) > 127 ? $number : 1;
$result += $bytes > 1 ? 1.0 : 0.5;
}
return $result;
}
function smartSubstr($string, $start, $length = null)
{
$result = '''';
$number = smartDetectUTF8($string) ? 3 : 2;
if($start < 0)
{
$start = max(smartStrlen($string) + $start, 0);
}
for($i = 0; $i < strlen($string); $i += $bytes)
{
if($start <= 0)
{
break;
}
$bytes = ord(substr($string, $i, 1)) > 127 ? $number : 1;
$start -= $bytes > 1 ? 1.0 : 0.5;
}
if(is_null($length))
{
$result = substr($string, $i);
}
else
{
for($j = $i; $j < strlen($string); $j += $bytes)
{
if($length <= 0)
{
break;
}
if(($bytes = ord(substr($string, $j, 1)) > 127 ? $number : 1) > 1)
{
if($length < 1.0)
{
break;
}
$result .= substr($string, $j, $bytes);
$length -= 1.0;
}
else
{
$result .= substr($string, $j, 1);
$length -= 0.5;
}
}
}
return $result;
}
function smarty_modifier_smartTruncate($string, $length = 80, $etc = ''...'',
$break_words = false, $middle = false)
{
if ($length == 0)
return '''';
if (smartStrlen($string) > $length) {
$length -= smartStrlen($etc);
if (!$break_words && !$middle) {
$string = preg_replace(''/\s+?(\S+)?$/'', '''', smartSubstr($string, 0, $length+1));
}
if(!$middle) {
return smartSubstr($string, 0, $length).$etc;
} else {
return smartSubstr($string, 0, $length/2) . $etc . smartSubstr($string, -$length/2);
}
} else {
return $string;
}
}
?>
以上代码完整实现了truncate的原有功能,而且可以同时兼容GB2312和UTF-8编码,在判断字符长度的时候,一个中文字符算1.0,一个英文字符算0.5,所以在截取子字符串的时候不会出现参差不齐的情况.
插件的使用方式没有特别之处,这里简单测试一下:
{$content|smartTruncate:5:".."}($content等于"A中B华C人D民E共F和G国H")
显示:A中B华C.. (中文符号长度算1.0,英文符号长度算0.5,并且考虑省略符号的长度)
不管你是使用GB2312编码还是UTF-8编码,你会发现结果都正确,这也是为什么我在插件名字里加上smart字样的原因之一。
分享到:
相关推荐
通过上述的修改,smarty中英文多编码字符截取乱码问题得到了解决。代码通过智能检测字符串的编码,并且按照字符的实际显示长度来截取文本,从而避免了使用传统truncate方法时会出现的乱码问题。这个解决方案不仅适用...
Smarty是一款广泛使用的PHP模板引擎,它允许开发者将HTML和PHP...通过以上方法,你应该能够成功解决Smarty中`truncate`处理中文字符串时的乱码问题。在实际开发中,对字符编码的理解和正确使用是避免此类问题的关键。
这是因为Smarty中的truncate修饰符主要用于英文字符截取,在处理中文字符时,由于一个中文字符通常占用的字节比英文字符多,所以直接截取会导致显示上出现乱码,比如中英文混合字符串时,截取同样数量的字符,中文...
//如果有中文则减去中文的个数 function smarty_modifier_truncate($string, $sublen = 80, $etc = '...', $break_words = false, $middle = false)
八、Smarty中英文结合版的优势 中英文结合版的手册既保留了原版的详细解释,又提供了中文翻译,对于国内开发者来说,更易于理解和学习。可以方便地查阅技术细节,同时解决语言障碍,提升学习效率。 九、手册使用...
在《Smarty1.pdf》和《Smarty2.pdf》这两份教程中,你将详细了解到如何安装和配置Smarty,如何编写模板,如何使用其提供的各种功能,以及如何解决常见问题。通过中英文对照的学习,你可以更好地理解和记忆这些概念,...
2. **国际化与本地化**:讲解如何在Smarty中实现多语言支持,使用翻译函数和配置文件。 3. **高级缓存策略**:深入讨论更复杂的缓存策略,如依赖性检测、缓存生命周期管理。 4. **与框架的集成**:提供与主流PHP...
此外,modifier[1].cutstr可能还提供了其他高级选项,比如根据UTF-8编码来处理多字节字符,或者设定截取点是否必须位于单词边界等。这将使得中文字符串的处理更加灵活和精确,避免因截取导致的乱码或显示问题。 总...
然而,当涉及到非英文字符,如中文,时,可能会遇到导入数据时的乱码问题。这个问题通常出现在尝试从CSV(逗号分隔值)文件导入包含中文的数据时。 CSV文件是一种简单且通用的数据交换格式,但它的编码处理需要特别...
在这个手册中,你将找到关于Smarty的安装步骤、基本概念、语法结构、函数参考、配置选项以及常见问题解答等内容。 Smarty的核心特性包括: 1. **模板语言**: Smarty提供了一套简洁但功能强大的模板语言,允许设计...
本资源是Smarty的中英文对照版,对于学习和理解Smarty的用户来说非常有帮助,无论是初学者还是有一定基础的开发者,都能从中受益。 Smarty的主要特点包括: 1. **模板语法**:Smarty提供了一套简洁易懂的模板语法...
5. **配置选项**:Smarty有许多可配置的选项,如默认编码、安全模式、编译目录等,这些都可以根据项目需求进行调整。 6. **插件系统**:Smarty允许开发自定义函数(插件),扩展其功能。例如,可以创建一个插件来与...
在学习过程中,你可以通过"更多相关资料.url"来探索其他相关的学习资源,这可能是指向其他网站、论坛或者在线教程的链接,有助于你深入理解和应用Smarty。记住,不断实践是掌握任何技术的关键,尝试在实际项目中应用...
通过以上内容,我们了解到Smarty作为一种强大的模板引擎,在大型项目中可以发挥重要作用,尤其是在需要分离逻辑与外观的设计模式中。同时,我们也注意到其在某些特定场景下的局限性,因此在选择是否使用Smarty时需要...
Smarty3 是一个流行的PHP模板引擎,它将设计者与开发者的工作分离...同时,手册中的例子和教程也能帮助读者解决实际开发中遇到的问题。对于PHP开发者尤其是前端设计人员,Smarty3 中文手册是不可或缺的学习和参考工具。
10. **示例与案例**:通过实际的代码示例,演示如何在项目中应用Smarty,解决常见问题。 这份"Smarty中文开发手册"对于PHP开发者来说,不仅是一份工具书,更是提升开发效率和代码质量的重要指南。通过深入学习和...
你可以设置缓存生命周期,当数据未更新时,Smarty将从缓存中直接读取,而不是重新渲染模板。通过`$smarty->cache_lifetime`可以设置缓存时间。 7. **模板编译** Smarty将模板文件编译成PHP代码,然后执行这些编译...
在Smarty中,提供了一系列内置的函数,其中`truncate`函数用于对字符串进行截取,以满足在有限空间内显示部分文本的需求。 `truncate`函数的基本用法如下: ```php {$variable|truncate[:length][:append][:break]...
9. **多语言支持(Multilingual Support)**:Smarty提供了便捷的多语言处理机制,可以轻松地切换和管理网站的语言版本。 10. **Smarty 3.x的改进**:Smarty 3.x版本引入了许多新特性,比如更强大的模板引擎、增强...
通过阅读《Smarty完全中文手册》提供的详细指导,你将能够掌握如何有效地利用Smarty进行模板设计,理解其核心概念,解决实际项目中的问题,从而提升PHP开发效率和代码质量。无论是初学者还是经验丰富的开发者,都能...