即興で書いたのでチェックはいい加減ですがこんな感じでいかがでしょう。
<?php
function chkhankana($chr){
if(isset($chr)&&mb_strlen($chr)==1){
if(mb_convert_kana($chr,'KV')==$chr){
return false;
}else{
return true;
}
}
}
function strcnt($str){
$len = 0;
for($i=0;$i<mb_strlen($str);$i++){
$chr = mb_substr($str,$i,1);
if(chkhankana($chr)){
$len+=1;
}else{
$len+=strlen($chr);
}
}
return $len;
}
?>
<html>
<head>
<meta http-equiv=content-type content="text/html; charset=EUC-JP">
<title>文字列長</title>
</head>
<body>
<form action='<?=$_SERVER['SCRIPT_NAME']?>' method='POST'>
<h4>文字列長(半角英数カナは1byteでカウント)</h4>
<table>
<tr align="center"><th width=80>文字列</th>
<td><input type="text" name="str" size="40" maxlength="20">
<input type="submit" value="Submit"></td></tr>
</table>
</form>
<?php
$str = $_POST['str'];
$len = strcnt($str);
print "入力文字列=[ ".$str." ]<br>\n";
print "文字列長=[ ".$len." ]<br>\n";
if($len>20) print "20 byte Over!!\n";
?>
</body>
</html>
補足
ご回答ありがとうございます。 今回考えているのは、 半角カナだけなら、最大20文字まで入力可能で、 全角文字だけなら最大10文字まで入力可能な 形にしたいのです。 1文字ずつ文字を識別していって判断するしかないようですね。 半角カナの場合は1バイトとみなすようなことができればいいんですが。。。