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