• ベストアンサー

文字列の文字一文字ずつを解析して結果を表示したいのですが・・・

たとえば $data="あ5Aいう7えお" という文字列があったとして 一文字ずつの決まった長さの合計を表示しようとおもっています。 $KAZU=mb_strlen($data,"SJIS"); for($i=0;$i!=$KAZU;$i++){      $moji=mb_substr($data,$i,$i,"SJIS");      $moji_size=mb_strwidth($moji,"SJIS");      if($moji_size==2){           $px+=12;      }else{           if(mbereg("/[A-Z]./",$moji)){                $px+=10;           }elseif(mbereg("/[0-9]./",$moji)){                $px+=9;           }elseif(mbereg("/[a-z]./",$moji)){                $px+=8;           }else{                $px+=6;           }      }      if($px>370){           $px=0;           break;      } } print "$px"; $data="あ5Aいう7えお"の場合結果は(12+9+8+12+12+9+12+12=)86になってほしい この方法でやってもうまくいきませんでした。なんだか面倒なことしているような気もしますが、もっと簡単な方法など知っている方などいらっしゃいましたら、どなたか教えていただければ幸いです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

なんとなくプログラマーの野生の勘で、 > $moji=mb_substr($data,$i,$i,"SJIS"); $moji=mb_substr($data,$i,1,"SJIS"); > mbereg("/[A-Z]./",$moji) mb_ereg( "[A-Z]", $moji ) ※数字・英小文字も同様。 とかじゃないかなーと思わないでもなかったり。

vect-61
質問者

お礼

自分がmb_substr関数の使い方を間違って覚えていたみたいです… うまく動くようになりました。ありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

なんか数があわないとおもったらAは8じゃなくて10ですよね?? こんな感じでやるとよいのでは? <? $data="あ5Aいう7えお"; $px=strlen($data)*6;//1バイト文字は6、2バイト文字は12をたす if(preg_match_all("/[A-Z]/",$data,$matches)) $px+=count($matches[0])*4;//A~Zはさらに4をたす(つまり10をたす) if(preg_match_all("/[0-9]/",$data,$matches)) $px+=count($matches[0])*3;//0~9はさらに3をたす(つまり9をたす) if(preg_match_all("/[a-z]/",$data,$matches)) $px+=count($matches[0])*2;//a~zはさらに2をたす(つまり8をたす) print $px; ?>

vect-61
質問者

お礼

間違いに指摘されて今気づきました。大変申し訳ありませんでした。 こっちのほうが処理が簡単そうですね。使ってみたいと思います。 ご回答ありがとうございました。