• ベストアンサー

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

たとえば $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になってほしい この方法でやってもうまくいきませんでした。なんだか面倒なことしているような気もしますが、もっと簡単な方法など知っている方などいらっしゃいましたら、どなたか教えていただければ幸いです。 よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • 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
質問者

お礼

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

関連するQ&A

  • 文字列カットでの文字化けについて

    文字列のカットなのですが、 mb_substrを使っても最後が文字化けするので、 エンコーディング名を追加したら文字列がカットされなくなってしまいました。 以下のファイル http://www.hp-toolbox.com/rssup.zip に含まれるrssup.phpの 44行目 if (mb_strlen($title,"SJIS") > 46) { 45行目 $title = mb_substr($title,0,46,"SJIS"); $title .= "..."; 46行目 } です。 どなたか上手くいく方法を教えて下さい。 宜しくお願い致します。

    • 締切済み
    • PHP
  • substrで抜き取った全角文字列を正常に表示

    $moji1 = 'あいうえおかきくけこさしすせそ'; $moji2 = 'あいうえお...かきくけこ'; $moji3 = 'なにぬねの'; 上記のような3つの文字列を格納した変数があります。 それぞれの変数を使いリンクを貼りたいのですが、20バイトを超えた変数に対しては、substrで20バイトまでを表示し、リンクするようにします。 以下は$moji1をリンクにするソースです。 $byte = strlen($moji1); if ($byte > 20) {  $moji1 = substr($moji1,0,20); } echo '<a href="#">'.$moji1.'</a>'; moji2、moji3も全く同じ処理をします。 結果はmoji1、moji3は上手くいくのですが、moji2に関しては <a href="#">あいうえお...かき/a> このように</a>の'<'が消えてしまいます。 恐らく、20バイト目が全角で、表示が上手くいっていないのだと思うのですが、対処法がわかりません。 今は全角に変換してごまかしていますが、半角のものはなるべく半角で表示したいのです。 moji2を正常に表示させるには、どのような書き方をすれば良いのでしょうか。 アドバイスお願いします。

    • ベストアンサー
    • PHP
  • 続:日本語(マルチバイト)でのwordwrap処理

    日本語の文字列を、任意の字数で折り返す処理を行おうとしています。先にBLUEPIXYさんから以下のコードを頂きました。 ■■ #$line は、一行分のデータが文字列で入っている $n=10; # 改行させる(半角での)文字数 for($i=0;$i<mb_strlen($line);$i+=$len){ for($j=1;$j<=$n;$j++){ $wk=mb_substr($line,$i,$j); if(strlen($wk)>=$n) break; } $len=mb_strlen($wk); print ">$wk\n"; } ■■ このコードは美しく動くのですが、一つだけ問題があります。文中に改行が入っている場合に、改行後の文字列先頭に">"を付加する処理がないので、改行のある文章は、以下のように表示されてしまいます。 処理前の文字列: 1234567 890 処理後の文字列: >1234567 890 この"890"の手前にも">"を挿入するように、頂いたコードを変更してみました。こんな感じでやれば改行("\n")が拾えると思ったのですが。。。 ■■ for($i=0;$i<mb_strlen($message);$i+=$len){ for($j=1;$j<=$crlf;$j++){ $wk=mb_substr($message,$i,$j); //追加部分↓ $crlfChk=mb_substr($message,$i+$j,1); if($crlfChk=="\n") break; //追加部分↑ if(strlen($cnt)>=$crlf) break; } $len=mb_strlen($wk); print ">$wk\n"; } ■■ 追加部分の拾い方が間違っているのかな、と思うのですが、正解が分かりません。それとも、どこか別の部分が根本的に間違っているのでしょうか。(ローカルの環境はSJISなので、mb関数が正しく動作していないとか。。。?) どなたかご教授頂ければ幸いです。よろしくお願いします。

    • ベストアンサー
    • PHP
  • Warning: mb_strpos(): Unknown encoding or conversion error について

    フォームから入力した文字を $myvalue["kana_mei"] = mb_convert_encoding($_POST["kana_mei"], "SJIS"); でSJISに変換し、 $sStr = $val["kana_mei"]; $sAllowedChars ="あいうえおぁぃぅぇぉかきくけこがぎぐげごさしすせそざじずぜぞたちつってとだぢづでどはひふへほばびぶべぼぱぴぷぺぽまみむめもなにぬねのらりるれろやゆよゃゅょわをんー "; ($sAllowedChars, "SJIS"); If(mb_strlen($sStr) > 0 ) { for ($i=0;$i<mb_strlen($sStr);$i++) { $sStr1= mb_substr($sStr,$i,1); if(!is_integer(mb_strpos($sAllowedChars,$sStr1))) { $err_msg["kana_mei"] = "※ひらがなでご記入ください。"; } } } でひらがなチェックを行っています。 IE6.0 IE7.0 では、問題ないのですが、MAC IE5.0 Fireworksでは、 mb_substr()で”Warning: mb_strpos(): Unknown encoding or conversion error”となってしまいます。 PHPのバージョンは、4.4.2です。 何方か、対処方法、教えて下さい。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 文字を入れ替える

    abcdefacdeeabとあるとします。 abと文字が来るときだけabを++に置き換えたいのです。 aだけ変えるのを考えたのですが bがある場合は+ とbがない場合はaも変えない と言うのが考えつきません。 char *a; int i; fgets=(moji,100,stdin); *a=moji[100]; for( i = 0 ; ; i++ ) { if( *(a+i) == 'a' ) { moji[i]='+'; else { moji[i]=*( a + i ); } if(*( a + i ) == '\0'); break; } 見にくいですがよろしくお願いします。

  • 文字列の検索&排除をするプログラム

    「a=i;」とするとご存知の通り、aにiという変数を代入します。 しかし、変数としてではなく「文字(char型)」として処理したいと考えております。 例えば、「1,2,3,a,4,5,6」という文字列を1文字ずつ読み込み、 「a」という文字であれば表示しない、 という感じのプログラムを作成したいと思います。 つまり、「1,2,3,a,4,5,6」が「1,2,3,4,5,6」となります。 moji[]に「1,2,3,a,4,5,6」をchar型で代入したときの プログラムの例を書きます。 for (i = 0; i <= 6; i++){ if(moji[i]==a){//何もしない、ちなみに間違えています。 } else{//a以外が表示される printf("%c", moji[i]); } } 質問は「moji[i]==a」この部分を文字(char型)の「a」とし、 「1,2,3,a,4,5,6」を「1,2,3,4,5,6」の様に処理したいのですが、 どうしたらよろしいでしょうか?

  • 携帯絵文字の掲示板について

    いつも感謝してますが、また質問してしまいました。 本当に情けないです。。。。 現在携帯サイトを構築しています。 PHP×携帯デベロッパーズバイブルって本の掲示板の一部分なんですが、以下の箇所(具体的には正規表現の箇所)でエラーがでます。 またこの掲示板のスクリプトなんですが、この本自体のサンプルコードはどこかに落ちてないのでしょうか? できれば、それが一番早いんですが。。。。 /* * 絵文字の入った入力文字列を内部絵文字の入った文字列に変換する(SoftBankの3GC) * * @param integer $data 入力された文字列 * @return string 内部絵文字に変換された文字列 */ function emoji_text_input_softbank_utf8($data){ //入力文字が空の場合 if(empty($data)){ return $data; } $old_data=$data; $new_data=''; while(1){ if(strlen($old_data)==0){ break; } $moji=mb_substr($old_data,0,1,'UTF-8'); $old_data=mb_substr($old_data,1,mb_strlen($old_data),'UTF-8'); //内部絵文字に変換する。 $output=preg_replace_callback('/\xEE([\x80\x81\x84\x85\x88\x89\x8C\x8D\x90\x91\x94][\x80-\xBF])/','emoji_input',$moji); $new_data.=$output; } return $new_data; }

    • ベストアンサー
    • PHP
  • C言語の文字列の取り扱いが分かりません

    こんにちは。 C言語で分からないことがあり、質問させていただきました。 学校で、文字列の取り扱いを習いました。 そこで質問なんですが、以下のソースコードをstrcpy , strcat , strcmp , strlen を使わずに書くことってできないですか? 先生に質問したところ、ポインタとかいうのを使うのだそうですが、それを使わずに書くことってできるんですか?もしよろしければお願いします。 以下のプログラムですが、ユーザーから2つの文字列を受けて、そこから4つの文字列関数を使ってみましょう、というやつです。実行結果も貼っておきますね。 #include <string.h> #include <stdio.h> int main(void) { char str1[80], str2[80]; int i; printf("INPUT 1st word-line. : "); gets(str1); printf("INPUT 2nd word-line. : "); gets(str2); /*文字列(word-line)の長さを確認します。*/ printf("%s is %d moji long.\n", str1, strlen(str1)); printf("%s is %d moji long.\n", str2, strlen(str2)); /*文字列を比較します。*/ i = strcmp(str1, str2); if (!i) printf("two word-lines are same length.\n"); else if (i < 0) printf("%s is smaller than %s.\n", str1, str2); else printf("%s is bigger than %s.\n", str1, str2); /*十分なスペースがあるのなら、str2をstr1の最後に結合させます。*/ if((strlen(str1) + strlen(str2)) < 80 ){ strcat(str1, str2); printf("%s\n", str1); } /*str2をstr1にコピーする*/ strcpy(str1, str2); printf("%s %s\n", str1, str2);

  • mb_strlenはマルチバイト文字数をカウントしてくれるはずですよね?

    PHP初心者です。よろしくお願いします。 入力フォームから入力された名前を、下記のコードで エラーチェック行い、結果的に100文字以内の入力を許すように したいです。 if(isset($check_data["name"]) && trim($check_data["name"])=== ""){ $er[] = "お名前を入力して下さい。"; } elseif(mb_strlen($check_data["name"],'SJIS') > 100){ $er[] = "50文字以内でご入力下さい。"; } でも、100文字より大きくなれば・・・と判定しているのに、 51文字以上の入力で判定を受けてしまいます。 マルチバイト(2バイト)のちょうど半分です。 mb_strlenを使用しているのに、なぜ、マルチバイトの文字数を返してくれないのでしょうか? ちなみに上のコードは、>100 としつつ、出力分は50文字以内としております。 なんだかすっきりしません。

    • ベストアンサー
    • PHP
  • IE6で文字化け します。

    IE6で文字化け します。 以下のURLが、IE6で文字化けします。(IE8やMozillaでは正常です) http://cgi.geocities.jp/rhcpf907/fml2tex/?%BC%B0%A1%E3%20%A6%B2_{n=1}^N%20a_n%20%A6%B7_n%A1%A2%A6%B2_{m=1}^M%20b_m%20%A6%B5_m%20%A1%E4%20%A1%E1%A6%B2_{n=1}^N%A1%A1%A6%B2_{m=1}^M%A1%A1a_n^{*}b_m%20%A1%E3%A6%B7_n%A1%A2%A6%B5_m%20%A1%E4 IE8と見比べて頂けるとわかるのですが、<や> がおかしくなります。 回避策がありましたら、お教え下さい。 プログラムは、以下です。  $qstr = rawurldecode($_SERVER["QUERY_STRING"] );   :   :   if (strlen($qstr) <= 2){     return 'CanNotEncode';   }   // 自動検出   $encd = mb_detect_encoding($qstr, 'EUC-JP,SJIS,UTF-8,JIS');   if ($encd != ''){     $expr = mb_convert_encoding($qstr,"SJIS", $encd);     if ( mb_substr('式',0,1,'SJIS') == mb_substr($expr,0,1,'SJIS') ){       return $expr;     }   }   // Yahooブログ(EUC-JP) だけは救う   $expr = mb_convert_encoding($qstr,"SJIS", 'EUC-JP');   if ( mb_substr('式',0,1,'SJIS') == mb_substr($expr,0,1,'SJIS') ){      return $expr;   }   return 'EncodeFail ['.substr($qstr,0,8).']'; }   :   : // $exprから"式”を取り去って全角→半角にして MineTeX.cgi に渡す

    • ベストアンサー
    • PHP

専門家に質問してみよう