[转]怎麼用PHP對中英文分別限制輸入字數

jackxiang 2009-5-15 22:32 | |
比如一個文本框裡輸入中文的最多字數為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的就不知道怎麼做了。看看有沒有問題!

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1784/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!

评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]