比如一個文本框裡輸入中文的最多字數為1000,英文為2000,這可以實現嗎?我找了幾個代碼,都是不分中英文的,一個字母和一個漢字都作為一個字來算的。:confused:
判斷ascii應該可以實現的吧
我沒試
一個字一個字判斷,中文就size.=2,英文就size.=1,加起來限定一個值,這樣有沒有可行性?
直接設定總長度2000字節;
不管前面是中文還是英文,或者中英文混合,只對最後一個字判斷是不是中文;
如果是,而且只有半個中文,捨去。
謝謝
不過我不大明白,為什麼只對最後一個字進行判斷?
汗,我比較白...
因為你要限制字數嘛,而如果最後結尾的是個中國字,也就是個雙字節字符,那麼硬生生按2000字節來截取,就會產生亂碼,半個中國字。
我們當然不希望出現這樣的情況,所以,對最後一個字進行判斷咯。
實際寫段代碼看看,就明白了,說起來很費勁。
如何判斷最後一個字是漢字還是英文字母?怎麼把它截取出來?
這個太基本了,建議你用Google搜一下。另外,可以到phpx.com看看精華帖。
surran, sorry,你說的對菜鳥如我來說還是難以理解。我已經找到了一個分辨數字、字母、漢字的代碼,如下所示
$str ="i am an apple.";
$str = str_replace(" "," ",$str);//替換全角空格
$chinese = 0;
$blank =0;
$number =0;
$letter =0;
for($i=0;$i {
if(ord($str{$i})>128) $chinese++; //計算中文字數
if(ord($str{$i}) == 32) $blank++; //計算有多少空格
if(ord($str{$i})>47 && ord($str{$i}) <58) $number++;//計算有多少數字
if(ord($str{$i}) > 64 && ord($str{$i})<91 || ord($str{$i})>96 && ord($str{$i})<123) $letter++;//計算有多少字母
}
$chinese = $chinese/2;
$total=$blank+$chinese+$letter+$number;
echo "
漢字 $chinese 個,空格 $blank 個, 數字 $number 個, 字母 $letter 個,總共$total";
?>
運行結果是
漢字 0 個,空格 3 個, 數字 0 個, 字母 10 個,總共13
但是....我忽然發現我要統計的不是多少個字母,而是多少個字,比如「i am an apple."實際上加上空格是13個字母,但是只是7個字(單詞加空格),這要怎麼做才行?
我找到了利用空格鍵來計算單詞的函數,這樣可以獲得彼此分的英文單詞個數。
$array=explode(" ",$str); $wordnumber=sizeof($array);
但是如果中英文這樣混排:
i我 is是 an一個apple蘋果。
可以得到$wordnumber值為3,中文個數為6,但是實際上有4個單詞,6個中文字。
對沒有空格隔開的英文單詞又要怎麼統計呢?比如上面的」an一個apple蘋果「。
看看下面這段代碼,留心一下處理字符串最後的方法。
function TrimChinese($str,$len){
$r_str='';
$i=0;
while ($i<$len){
$ch=substr($str,$i,1);
if(ord($ch)>0x80) $i++;
$i++;
}
$r_str=substr($str,0,$i);
return $r_str;
}
function writeTitle($title,$shear){ //title=字符串,取長度
if (strlen($title)>$shear){
if (strlen($title)==($shear+2)){
return($title);
}else{
$title1=TrimChinese($title,($shear-2))."..";
return($title1);
}
}else{
return($title);
}
}
調用:
$getC="我來了呵呵";
writeTitle($getC,3);
$str="ok,搞定,TKS!這裡的人真好!";
function get_str($str,$strlen=10) {
for($i=0;$i<$strlen;$i++)
if(ord(substr($str,$i,1))>0xa0) $j++;
if($j%2!=0) $strlen++;
$tmp_str=substr($str,0,$strlen);
if (strlen($str)>$strlen) {$tmp_str.='...';}
return $tmp_str;
}
for($i=0;$i<strlen($str);){
$i+=2;
echo get_str($str)."<br>";
}
被逼到貼代碼了。
呵呵,其實我也很菜。大家一起學習。
剛才仔細看了看樓主的問題,我有跑題的嫌疑。
這裡請樓主明確一下,是需要限制文本框內的字總共4000,還是分別限制中文1000,英文2000?
不算一個字,算什麼?你是要算bytes?
是這樣的,要求從表單輸入一段文字,限制為:
如果全是中文,輸入字數範圍為400-1000字;
如果全是英文,輸入範圍為1000-2000單詞;
如果中英文混排,那麼字數範圍還是按中文要求在400-1000之間,這時候一個英文單詞算半各個字。
例如:
輸入「天氣很好」 這是4個漢字。(範圍為400-1000)
輸入「it is good" 這是3個單詞。(範圍為1000-2000)
輸入「it天氣is good weather"這是兩個漢字加4個單詞,4個單詞與2個漢字等同計量,總共字數為4,範圍還是為400-1000。
就是這樣的,不知道我說清楚了沒有。
我說的不分中英文的代碼,是指統計的時候一個漢字和一個字母是等同統計的,這樣就沒有辦法對中英文分開限制,而且我要統計的是單詞不是字母。
總字數好像沒限制,……還是不懂你的要求。
一個英文字母=半個中文字符,也就是說中文是雙字節的。
很好奇,這個東西用來做什麼的?
總字數有限制啊,也可以簡單限制為無論中英文都是400-1000,一個單詞等同一個漢字計算,比如「it天氣is good weather」,兩個漢字加4個單詞,就是6個字。
這個要用來做一個註冊系統,限制用戶提交的文字個數。漢字我已經會統計了,就是單詞麻煩。我現在想把除英文之外的所有字符用空格代替,然後用explode來統計,不知道行不行。昨天剛趕鴨子上架學了正則表示法。。。。
呵呵~單詞要是會做了~估計你可以在專研下~做個電子字典~
<?php
function count_words($str)
{
$str = str_replace(" "," ",$str);//替換全角空格
$byte = strlen($str);
$english_num = 0;
$chinese_num = 0;
$other_num = 0;
$flag = false;
for($i=0; $i<$byte;){
$ch=substr($str,$i,1);
if(ord($ch)>0x80){
if($flag){
$english_num++;
$flag = false;
}
$chinese_num ++;
$i += 2;
} else {
if(ord($ch)>=65 && ord($ch)<=90 || ord($ch)>=97 && ord($ch)<=122){
$flag = true;
} else {
if($flag){
$english_num++;
}
$flag = false;
$other_num++;
}
$i++;
}
}
echo "<br />\n";
echo "漢字:" . $chinese_num . "<br />\n";
echo "英文單詞:" . $english_num . "<br />\n";
echo "其他字符:" . $other_num . "<br />\n";
}
$str1 = "我來ccc了呵呵";
$str2 = "it天氣is good weather";
echo $str1;
count_words($str1);
echo $str2;
count_words($str2);
/* OutPut
我來ccc了呵呵
漢字:5
英文單詞:1
其他字符:0
it天氣is good weather
漢字:2
英文單詞:3
其他字符:3
*/
?>
利用數據結構中的傻瓜似的方法,中文字符是gb碼,若換成utf-8的就不知道怎麼做了。看看有沒有問題!
判斷ascii應該可以實現的吧
我沒試
一個字一個字判斷,中文就size.=2,英文就size.=1,加起來限定一個值,這樣有沒有可行性?
直接設定總長度2000字節;
不管前面是中文還是英文,或者中英文混合,只對最後一個字判斷是不是中文;
如果是,而且只有半個中文,捨去。
謝謝
不過我不大明白,為什麼只對最後一個字進行判斷?
汗,我比較白...
因為你要限制字數嘛,而如果最後結尾的是個中國字,也就是個雙字節字符,那麼硬生生按2000字節來截取,就會產生亂碼,半個中國字。
我們當然不希望出現這樣的情況,所以,對最後一個字進行判斷咯。
實際寫段代碼看看,就明白了,說起來很費勁。
如何判斷最後一個字是漢字還是英文字母?怎麼把它截取出來?
這個太基本了,建議你用Google搜一下。另外,可以到phpx.com看看精華帖。
surran, sorry,你說的對菜鳥如我來說還是難以理解。我已經找到了一個分辨數字、字母、漢字的代碼,如下所示
$str ="i am an apple.";
$str = str_replace(" "," ",$str);//替換全角空格
$chinese = 0;
$blank =0;
$number =0;
$letter =0;
for($i=0;$i
if(ord($str{$i})>128) $chinese++; //計算中文字數
if(ord($str{$i}) == 32) $blank++; //計算有多少空格
if(ord($str{$i})>47 && ord($str{$i}) <58) $number++;//計算有多少數字
if(ord($str{$i}) > 64 && ord($str{$i})<91 || ord($str{$i})>96 && ord($str{$i})<123) $letter++;//計算有多少字母
}
$chinese = $chinese/2;
$total=$blank+$chinese+$letter+$number;
echo "
漢字 $chinese 個,空格 $blank 個, 數字 $number 個, 字母 $letter 個,總共$total";
?>
運行結果是
漢字 0 個,空格 3 個, 數字 0 個, 字母 10 個,總共13
但是....我忽然發現我要統計的不是多少個字母,而是多少個字,比如「i am an apple."實際上加上空格是13個字母,但是只是7個字(單詞加空格),這要怎麼做才行?
我找到了利用空格鍵來計算單詞的函數,這樣可以獲得彼此分的英文單詞個數。
$array=explode(" ",$str); $wordnumber=sizeof($array);
但是如果中英文這樣混排:
i我 is是 an一個apple蘋果。
可以得到$wordnumber值為3,中文個數為6,但是實際上有4個單詞,6個中文字。
對沒有空格隔開的英文單詞又要怎麼統計呢?比如上面的」an一個apple蘋果「。
看看下面這段代碼,留心一下處理字符串最後的方法。
function TrimChinese($str,$len){
$r_str='';
$i=0;
while ($i<$len){
$ch=substr($str,$i,1);
if(ord($ch)>0x80) $i++;
$i++;
}
$r_str=substr($str,0,$i);
return $r_str;
}
function writeTitle($title,$shear){ //title=字符串,取長度
if (strlen($title)>$shear){
if (strlen($title)==($shear+2)){
return($title);
}else{
$title1=TrimChinese($title,($shear-2))."..";
return($title1);
}
}else{
return($title);
}
}
調用:
$getC="我來了呵呵";
writeTitle($getC,3);
$str="ok,搞定,TKS!這裡的人真好!";
function get_str($str,$strlen=10) {
for($i=0;$i<$strlen;$i++)
if(ord(substr($str,$i,1))>0xa0) $j++;
if($j%2!=0) $strlen++;
$tmp_str=substr($str,0,$strlen);
if (strlen($str)>$strlen) {$tmp_str.='...';}
return $tmp_str;
}
for($i=0;$i<strlen($str);){
$i+=2;
echo get_str($str)."<br>";
}
被逼到貼代碼了。
呵呵,其實我也很菜。大家一起學習。
剛才仔細看了看樓主的問題,我有跑題的嫌疑。
這裡請樓主明確一下,是需要限制文本框內的字總共4000,還是分別限制中文1000,英文2000?
不算一個字,算什麼?你是要算bytes?
是這樣的,要求從表單輸入一段文字,限制為:
如果全是中文,輸入字數範圍為400-1000字;
如果全是英文,輸入範圍為1000-2000單詞;
如果中英文混排,那麼字數範圍還是按中文要求在400-1000之間,這時候一個英文單詞算半各個字。
例如:
輸入「天氣很好」 這是4個漢字。(範圍為400-1000)
輸入「it is good" 這是3個單詞。(範圍為1000-2000)
輸入「it天氣is good weather"這是兩個漢字加4個單詞,4個單詞與2個漢字等同計量,總共字數為4,範圍還是為400-1000。
就是這樣的,不知道我說清楚了沒有。
我說的不分中英文的代碼,是指統計的時候一個漢字和一個字母是等同統計的,這樣就沒有辦法對中英文分開限制,而且我要統計的是單詞不是字母。
總字數好像沒限制,……還是不懂你的要求。
一個英文字母=半個中文字符,也就是說中文是雙字節的。
很好奇,這個東西用來做什麼的?
總字數有限制啊,也可以簡單限制為無論中英文都是400-1000,一個單詞等同一個漢字計算,比如「it天氣is good weather」,兩個漢字加4個單詞,就是6個字。
這個要用來做一個註冊系統,限制用戶提交的文字個數。漢字我已經會統計了,就是單詞麻煩。我現在想把除英文之外的所有字符用空格代替,然後用explode來統計,不知道行不行。昨天剛趕鴨子上架學了正則表示法。。。。
呵呵~單詞要是會做了~估計你可以在專研下~做個電子字典~
<?php
function count_words($str)
{
$str = str_replace(" "," ",$str);//替換全角空格
$byte = strlen($str);
$english_num = 0;
$chinese_num = 0;
$other_num = 0;
$flag = false;
for($i=0; $i<$byte;){
$ch=substr($str,$i,1);
if(ord($ch)>0x80){
if($flag){
$english_num++;
$flag = false;
}
$chinese_num ++;
$i += 2;
} else {
if(ord($ch)>=65 && ord($ch)<=90 || ord($ch)>=97 && ord($ch)<=122){
$flag = true;
} else {
if($flag){
$english_num++;
}
$flag = false;
$other_num++;
}
$i++;
}
}
echo "<br />\n";
echo "漢字:" . $chinese_num . "<br />\n";
echo "英文單詞:" . $english_num . "<br />\n";
echo "其他字符:" . $other_num . "<br />\n";
}
$str1 = "我來ccc了呵呵";
$str2 = "it天氣is good weather";
echo $str1;
count_words($str1);
echo $str2;
count_words($str2);
/* OutPut
我來ccc了呵呵
漢字:5
英文單詞:1
其他字符:0
it天氣is good weather
漢字:2
英文單詞:3
其他字符:3
*/
?>
利用數據結構中的傻瓜似的方法,中文字符是gb碼,若換成utf-8的就不知道怎麼做了。看看有沒有問題!
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1784/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
评论列表