php截取一段文字的前一百个字的问题

我想用php截取一段文字,这段文字里有汉字和字母,但有时候刚还截取汉字的一半。
怎么避免?

一般英文字符占一个字节,汉字占两个字节,有这么一种思路,在截取字符串的时候逐个判断要截取的字符是汉字还是英文字符,这样就不会出现错误了,下边给你帖一个我写的程序,你自己看下
<html>
<head>
<title>无标题文档</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

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

}
?>
<form action="" name="myform" method="post">
输入字符串:<input type="text" name="str" value="5555我爱My祖国" /><br />
输入起始位置:<input type="text" name="str_start" /><br />
输入截取长度:<input type="text" name="str_len" /><br />
<input type="submit" name="sub" value="开始截取字符串" />
</form>
<?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]);
}
?>
</body>
</html>
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-06-04
用php的
string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )

前提是php要安装 mb扩展
第2个回答  2012-06-04
mb_substr($string,0,100)

php截取一段文字的前一百个字的问题
if($s>=$len) break;\/\/如果已经截取的字符串长度超过要截取的长度 跳出循环 返回结果 if(ord(substr($str,$i,1))>0xa0){ \/\/判断是否为汉字 if($j+1>=$start){\/\/如果当前截取字符位置大于等于要截取的字符串的开始位置并且当前已经截取的字符长度还没有超出要截取的字符串的长度 则将此字符...

PHP中如何读取数据前100字符
} str = "abcd需要截取的字符串";echo cut_str($str, 8, 0, 'gb2312');?>

PHP截取某个字符串前面的数字
编写一个PHP函数,专门用于提取字符串中某个字符前的所有数字。函数定义如下:function getNumbersBeforeChar($string, $char) { pattern = '\/(d+)(?=' . preg_quote($char) . ')\/';preg_match($pattern, $string, $matches);return isset($matches[1]) ? $matches[1] : '';} 举例说明...

PHP中如何用正则表达式分离出某个关键词前后的文字?
匹配之后,每一个域名前的100个字符在$reg[1]数组里面,后面的100个字符在数组$reg[2]里面。

php正则匹配如何截取前200个字符,跪求大神解答
php $str="abcd123456";$pattern='\/^(.{0,6}).*?$\/i';preg_match($pattern,$str,$matches);print_r($matches);效果如下图:我看了你的$pattern,即\/^(.{0,200}).*?$\/i首先你使用了^...$这个结构表示精确匹配某个字符串,逐个分析你的表达式,首先(.{0,200})表示匹配除"\\n"外...

PHP中如何用正则表达式分离出某个关键词前后的文字?
这种简单的匹配不建议使用正则表达式,用php的explode()函数就可以了。str_arr = explode("域名",$str);具体取关键词左右的文字是什么意思,是取该关键字前100个字,和该关键字后100个字码。如果是这样那就要用substr来截取一下了。注意要考虑汉字与字符的区别。刚才测了一下,程序确实有点问题,...

php如何提取字符串前几位
php提取字符串前几位的方法:可以利用substr()函数来提取。该函数可以返回字符串中的提取部分,如果失败则返回false,或者返回一个空字符串,如【substr($str, 0, 3);】。substr() 函数返回字符串的提取部分,如果失败则返回 FALSE,或者返回一个空字符串。(推荐教程:php图文教程)语法:substr(...

php正则匹配如何截取前200个字符,跪求大神解答
$\/i首先你使用了^...$这个结构表示精确匹配某个字符串,逐个分析你的表达式,首先(.{0,200})表示匹配除"\\n"外的0到200个字符,而^表示以(.{0,200})开头,而后面的.*表示0个或多个单个字符,而.*?结合起来则表示使用懒惰模式,匹配任意数量的重复个字符,\/i表示去区分大小写,使用你的$p...

...php中 我想截取这个字段中某个字符之前的文字 请问如何写?_百度...
可以结合substr函数及strrpos函数使用,即用以下表达式即可获得新的a值:newa = substr($a,0,strrpos($a,'&')); \/\/新的$a值 比如:substr("123456777778",0,strrpos("123456777778",'7'))结果应该是否123456 参考:http:\/\/zhidao.baidu.com\/question\/281745831.html ...

PHP截取一个字符串里某个符号前面的字符串
回答:最简单的应该是用strstr()函数,如: echo strstr( '111|aaa|222|bbb', '|', TRUE ) \/\/ 输出:111 函数具体说明可以自己去查手册,http:\/\/www.php.net\/manual\/zh\/function.stristr.php

相似回答