php要截取一段汉语文字,怎样才能保证不把汉字拆开?

作者&投稿:磨制 (若有异议请与网页底部的电邮联系)
php截取一段文字的前一百个字的问题~

一般英文字符占一个字节,汉字占两个字节,有这么一种思路,在截取字符串的时候逐个判断要截取的字符是汉字还是英文字符,这样就不会出现错误了,下边给你帖一个我写的程序,你自己看下


无标题文档




<?php
function msubstr($str,$start,$len){

}
?>

输入字符串:

输入起始位置:

输入截取长度:



<?php
/*截取字符串的函数--------------数组式截取*/
function msubstr2($str,$start,$len){
$t = explode(" ",microtime());
$tt = round($t[0],5);
//将字符串中每个字符分开 并放到数组中
$str_arr = array();
$j = 1;
for($i=0;$i<strlen($str);$i++){
if(ord(substr($str,$i,1))>0xa0){ //说明是汉字 则需要一次截取3个字符
$str_arr[$j] = substr($str,$i,3);
$i = $i+2;
}else{
$str_arr[$j] = substr($str,$i,1);
}
$j++;
}
print_r($str_arr);
for($i=$start;$i<=$len+$start-1;$i++){
if($i>count($str_arr)){ //判断是否超出数组最大长度 如果是 则结束循环
break;
}
$str_temp .= $str_arr[$i];
}
$t = explode(" ",microtime());
$ttt = round($t[0],5);
return $ttt-$tt;
//return $str_temp;
}
function msubstr1($str,$start,$len){
$t = explode(" ",microtime());
$tt = round($t[0],5);
$j = 0; //记录截取的字符串的字符位置
$s = 0; //记录已经截取的字符长度
$str_temp = "";//记录截取的字符串
$k = strlen($str);
for($i=0;$i<$k;){//循环全部字
if($s>=$len) break;//如果已经截取的字符串长度超过要截取的长度 跳出循环 返回结果
if(ord(substr($str,$i,1))>0xa0){ //判断是否为汉字
if($j+1>=$start){//如果当前截取字符位置大于等于要截取的字符串的开始位置并且当前已经截取的字符长度还没有超出要截取的字符串的长度 则将此字符为要截取的字符
$str_temp .= substr($str,$i,3);
$s++;//已经截取的字符串长度加1
}
$j++;//当前截取的字符串的位置加1
$i+=3;//确定为汉字 在utf8编码下占三个英文字符的长度 则需要记录三个字符
}else{
if($j+1>=$start){
$str_temp .= substr($str,$i,1); //截取英文字符
$s++;//已经截取的字符串长度加1
}
$j++;//当前截取的字符串的位置加1
$i++;//非汉字字符占一个字符的长度
}
}
$t = explode(" ",microtime());
$ttt = round($t[0],5);
//return $ttt-$tt;
return $str_temp;
}
if($_POST[sub]){
echo msubstr1($_POST[str],$_POST[str_start],$_POST[str_len]);
}
?>

"; echo "mb_strcut:" . mb_strcut($str, 0, 6, 'utf-8'); //结果:这样 ?>
首先 1.确保你的Windows/system32下有php_mbstring.dll这个文件,没有就从你Php安装目录extensions里拷入Windows/system32里面。 2.在windows目录下找到php.ini打开编辑,搜索mbstring.dll,找到 ;extension=php_mbstring.dll把前面的;号去掉,这样mb_substr函数就可以生效了 mb_strcut函数功能也可以截取字符串长度,下面实例具体看看区别在哪:
mb_substr();

还得看你的编码是gbk的还是UTF8的。

以下是UTF-8的编码下的截取
function smarty_modifier_truncate_utf8($string, $length, $etc = '...')
{
$result = '';

$string = html_entity_decode(trim(strip_tags($string)), ENT_QUOTES, 'UTF-8');

$strlen = strlen($string);

for($i = 0; (($i < $strlen) && ($length > 0)); $i++)
{
if($number = strpos(str_pad(decbin(ord(substr($string, $i, 1))), 8, '0', STR_PAD_LEFT), '0'))
{
if($length < 1.0)
{
break;
}

$result .= substr($string, $i, $number);

$length -= 1.0;

$i += $number - 1;
}
else
{
$result .= substr($string, $i, 1);

$length -= 0.5;
}
}

$result = htmlspecialchars($result, ENT_QUOTES, 'UTF-8');

if($i < $strlen)
{
$result .= $etc;
}

return $result;
}

以下是GBK编码下的截取(常用)

function gbk_strlen($string)
{
if(extension_loaded('mbstring'))
{
mb_internal_encoding('GBK');

return mb_strlen($string);
}
else
{
preg_match_all('/[\x81-\xfe]?./', $string, $match);

return count($match[0]);
}
}

function gbk_substr($string, $start, $length = null)
{
if(extension_loaded('mbstring'))
{
mb_internal_encoding('GBK');

if(is_null($length))
{
return mb_substr($string, $start);
}
else
{
return mb_substr($string, $start, $length);
}
}
else
{
preg_match_all('/[\x81-\xfe]?./', $string, $match);

if(is_null($length))
{
return implode('', array_slice($match[0], $start));
}
else
{
return implode('', array_slice($match[0], $start, $length));
}
}
}
function smarty_modifier_truncate_gbk($string, $length = 80, $etc = '...',
$break_words = false, $middle = false)
{
if ($length == 0)
return '';

if (gbk_strlen($string) > $length) {
$length -= gbk_strlen($etc);
if (!$break_words && !$middle) {
$string = preg_replace('/\s+?(\S+)?$/', '', gbk_substr($string, 0, $length+1));
}
if(!$middle) {
return gbk_substr($string, 0, $length).$etc;
} else {
return gbk_substr($string, 0, $length/2) . $etc . gbk_substr($string, -$length/2);
}
} else {
return $string;
}
}

判断 ASCII 的高位 > 128

参考:http://www.readlog.cn/show-180-1.htm


hp pavilion dv2000如何截取屏幕图片
其实截取屏幕不需要什么软件,电脑自带的Print Screen按键就可以做到,对于像你这样的笔记本电脑Print Screen需要搭配Fn键来使用,即:同时按下(Fn)+(prt sc)组合键。不过要注意的是:单独按下(Fn)+(prt sc)键时,抓取的是笔记本整个屏幕的所有内容。按下(Fn)+(Alt)+(prt sc)组合键时,抓取的是...

如何用尺规作图把一线段分成三等分
连接该三等长线段终点和给定的线段的另一端点成一直线,过三等长线段的等分点作该直线的平行线与给定线段的交点即可三等给定的线段。2.这比较难 先做给定的角的平分线,在角平分线上取一点作一垂直该平分线得直线 在该直线上截一线段(AB)使其被角平分线平分 然后另取角平分线上一点O,以O点为圆心...

关于while循环截取出字符串
public int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引)2 s = s.substring(index + sToFind.length()); 3+sToFind.length()得到一个7的,即从第s的第7个位置开始截一个子字符串,最后s="hpjavaokjavajjavahahajavajavagoodjava"具体过程 第一次循环 1 index="...

惠普的笔记本的截屏是fn+prtsc,这个截的是全屏的,我想截窗口的该怎么...
打开绘图板,CTRL+V复制全屏的 ,然后里面有款选命令

惠普彩色打印机怎么用
导语:随着数码科技的发展,打印机安全正成为一个越来越重要的话题,一些公司的打印机可能会感染恶意软件,从而会导致公司的机密信息泄漏等情况发生。惠普打印机可以对传输和打印环节进行有效的监控和管理,确保敏感或机密信息不被泄漏或者被人恶意截取。那么惠普采用打印机使用方法是什么呢?接下来就让我们一...

hp laserjet m1005 mfp打印机卡纸怎么处理
1、准备好需要的工具:十字螺丝刀;剪刀;绝缘胶带。2、然后我们把故障打印机拔掉电源线、打印数据线,放到比较空阔的工作台上。3、取出硒鼓,顶盖保持打开状态。4、然后将打印机背面朝向自己,在左侧打印机数据线接口附件找到图示螺丝,并用准备好的十字螺丝刀拧下螺丝。5、上一步的图示黑螺丝拧下后,...

HPM1005打印机卡纸怎么办?
1、打印机卡纸只需要将卡主的纸取出来重新启动打印机就可以正常打印了,取出卡纸的具体步骤如下:如果是进纸器(放纸进打印机的地方)卡纸,轻轻地从进纸器中取出卡纸即可。2、如果是出纸器(打印纸张送出的位置)卡纸,要打开扫描仪盖,抓住误送的纸,双手小心地向右拉,将其从送纸区域中取出 3、...

HP Proliant110g6做raid0安装redhatAS5完成后启动提示找不到\/dev\/r...
惠普服务器只要是B110I阵列卡的服务器,安装linux操作系统后,都会在选择系统分区时,多出来一个空间,尤其是做RAID 1后,这样会出现问题的,建议在惠普官方网站上下载B110i阵列卡的驱动,用软驱来加载1、先到HP官方网站下载用软驱加载的阵列卡驱动,一般在Software---Driver Diskettes处 2,、2、下载解...

hp1008打印机打印第二张出来一半就卡住怎么办?
可以尝试通过纸盘上部或从顶盖区域把它拉出。输出区域卡纸:纸张卡在顶部输出区域,但大部分纸张仍留在打印机内,则最好通过后挡门取出纸张。这样可以顺着辊轴在后挡门拉出。双面器卡纸:首先打开双面盖拉动一下看不能不能拉出纸,如果不能的话把就先墨盒拿出来就能轻易把纸张拿出了。

谁知道:HP laserjet 5100 SE激光打印机 为什么用B5纸打印出来效果总是与...
我遇过这种问题,当时是打印机连在A机上,A机将打印机共享,然后在B机上打印,就有这种情况发生,调了半天也没调好,后来用了个偷懒的办法,既然它是横着打印出来,那就把纸也横着摆进去,出来的也就是横的了,你的B5的纸张是可以横着放进去的!

太和县19666103196: php 怎么截取汉字字符串? -
肥昌赛福: $str = '这样一来我的字符串就不会有乱码^_^'; echo "mb_substr:" . mb_substr($str, 0, 7, 'utf-8'); //结果:这样一来我的字 echo ""; echo "mb_strcut:" . mb_strcut($str, 0, 6, 'utf-8'); //结果:这样 ?> 首先 1.确保你的Windows/system32下有...

太和县19666103196: 实现php截取部分文章 -
肥昌赛福: 实际上PHP核心是把所有的文本都安ASIIC来看待的,GBK编码下一个中文字符是2个字节,所以substr时候有可能截取办个中文字符例如stbstr("a中", 0, 2)就把“中”截断了.mb_string有的服务器没有编译进去.下边有一个截取中文字符的...

太和县19666103196: 如何利用PHP来截取一段中文字符串而不出现乱码 -
肥昌赛福: /* 功能:截取全角和半角混合的字符串以避免乱码 参数: $str_cut 需要截断的字符串 $length 允许字符串显示的最大长度*/ function substr_cut($str_cut,$length = 30){if (strlen($str_cut) >; $length){ for($i=0; $i if (ord($str_cut[$i]) >; 128) $i++; $str_...

太和县19666103196: php 如何实现中文无乱码截取用哪个函数 -
肥昌赛福: 中文截取:mb_substr() mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $length,要截取的字数 $encoding,网页编码,如utf-8,GB2312,GBK

太和县19666103196: [php]如何在PHP中截取中文字串无乱码 -
肥昌赛福: 一年前写的一个函数.用法与substr一样,支持中文.您也可以加以改进. //截取字符串含数,对系统函数的改进,不会将中文变乱. function mysubstr ($str,$start,$len=0,$cutchar="…") { $str=str_replace(" ",' ',$str); $str=str_replace("“",'...

太和县19666103196: php分割中文字符串 -
肥昌赛福: $str = ereg_replace('[\W\_]+','',$str)\W 大写W===================================噢...你要的是保留中文呀...$str = ereg_replace('[\w[:punct:]]+','',$str)

太和县19666103196: 用php如何切取一篇文章里面开头的一部分字 -
肥昌赛福: 字符串截取函数可以 /* 截取一定长度的完整的中文字符 */ function cnsubstr($str,$strlen=10) { if(empty($str)||!is_numeric($strlen)){ return false; } if(strlen($str)return $str; }//得到第$length个字符 并判断是否为非中文 若为非中文//直接返回$length长...

太和县19666103196: php如何分割中文字符串 -
肥昌赛福: php分割中文字符串,如果直接用PHP函数“str_split”来分割,会出现乱码,因为中文字符长度和英文字符长度是不一样的.所以,可以建立新的函数先把字符转成ASCII值,接着通过判断不同字符的长度来正确分割中文字符串,把结果存入数...

太和县19666103196: 跪求个php的字段截取、、、、或者yii的字段截取.... -
肥昌赛福: PHP截取中英文字符串,不按字符数而是按宽度来截取,具体代码如下function subUTF8($string, $length = 80, $etc = '...') { $strcut = ''; $strLength = 0; $width = 0; if(strlen($string) > $length) { $sl = strlen($string); for($i = 0; $iif ( $width >= $length) { ...

太和县19666103196: php如何截取中文字符 -
肥昌赛福: mb开头的是多字节字符串处理函数,可以用这些函数 或者用正则处理也可

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网