- ベストアンサー
PHPのif文判定でelseの処理が実行される問題が発生しています
- PHPのif文で条件判定を行っていますが、正しく処理が実行されません。
- URLの日本語や英数字をカウントする際に文字数が正しく計算されない可能性があります。
- 改善策としては、文字列の長さを取得する際にmb_strlen関数を使用することが推奨されます。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
urldecodeとurlencodeの見間違い…かな? $url には url"decode" された値が入っているので、もちろんマルチバイト文字を含む可能性はありますね。そのマルチバイト文字の有無を判定するのであれば $url = urldecode($_SERVER['REQUEST_URI']); if (strlen($url) === mb_strlen($url, 'UTF-8')) { /* マルチバイト文字を含まない */ } else { /* マルチバイト文字を含む */ } これだけのことで済みますが。 >> ($counthensu=8 $mbhensu=8とechoでは表示されていても) ちょっとこれは考えられないです。何らかのコーディングミスがあったと考えるのが普通です。もし異議があれば、echoで表示している実際のソースコードの提示をお願いします。
その他の回答 (6)
- agunuz
- ベストアンサー率65% (288/438)
おおっと、たしかにurldecodeですね(汗 $url = urldecode($_SERVER["REQUEST_URI"]); #指摘thx.>To_aru_Userさん ただ、これで本当にutf-8の文字列だとしたら、QueryStringに日本語が含まれていなければ、手元の環境(&提示されたソース)ではどうやっても if は真になるんですよね。 どういうQueryStringで試しているのかを書いていただけるといいかもしれません(まさか日本語しか試していないってことじゃないですよね?)
お礼
agunuzさん、ご回答ありがとうございます。 お返事が遅れ申し訳ありません。 たくさんのご回答をいただき 非常に恐縮なのですが、No6さんのおっしゃる通り ifの処理内におけるコーディングミスでした。 しかしながら皆さんの助言の中に深い 知識、ノウハウがあり私としても 大変勉強になりました。 このたびは貴重なご回答ありがとうございました。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
No4さん。。 $url = urldecode($_SERVER["REQUEST_URI"]); たしかに!! その通りだわ。私も見落としてた。 すでに、生じゃないですね。この時点で。 最初からラテン変換終わってる(w)
お礼
AsarKingChangさん、ご回答ありがとうございます。 お返事が遅れ申し訳ありません。 たくさんのご回答をいただき 非常に恐縮なのですが、No6さんのおっしゃる通り 原因はifの処理内におけるコーディングミスでした。 しかしながら皆さんの助言の中に深い 知識、ノウハウがあり私としても 大変勉強になりました。 このたびは貴重なご回答ありがとうございました。
- agunuz
- ベストアンサー率65% (288/438)
>判定がすべてelseの処理となってしまいます。 逆じゃないんですか? urlencodeした文字列($url)からは、すでにマルチバイト文字は消えてしまっているハズです(でないとurlencodeした意味がない)。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
"%82%d9%82%c9%82%e1%82%e7%82%e7" 追加です~ これ、UTFじゃなくてSJISですね^ 「ほにゃら」じゃないですか(w) UTF8なら、 E3 81 BB E3 81 AB E3 82 83 E3 82 89 ですな(w) ただ、どっちにしても7ビット目をチェックするだけで ASCII文字だけか?はチェックできますけどね。 SJISの1バイト目も、UTF8の1バイト目も、絶対に00-7Fの 範囲外なのは保証されていますので。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
>要はURLに日本語が含まれているかどうかという判定を行っています。 あ~ $mbhensu = mb_strlen($url,'utf8'); if(strlen($url) == $mbhensu) { ifの処理 } else { elseの処理 } こんなのどうでしょ? %~~が変換されたのであれば、長さが変わるので、falseとなり %を含まないなら、長さは同じになる!。 ただ、これですが、%~~=日本語ではなくて URLに書くことが出来ない文字も%20=spaceだったりもするので、 それは正しいわけではない!という点は注意が必要です。 厳密にやりたいなら、UTLの1バイト目の文字があるか? を使うべきでしょう。。 ord() 文字コードを返す これを使って、 http://www.seiai.ed.jp/sys/text/java/utf8table.html 8x,9x,Ax,Bx 多バイト文字の2バイト目以降 <をチェックしたいが、 その前に、 00-7x 1バイト文字 ならば、簡単で、 if (ord(target)&0x80) /* 2バイトあり */ ってことですね。 これを $japaneseorenglish = str_split($url); $counthensu = count($japaneseorenglish); この変数の分まわせばチェックできますね。 と言うのを関数にして、 function check_1byte_char($url) { // } とでも、作成すれば後から改良もできますし。 どうでしょうか?
- AsarKingChang
- ベストアンサー率46% (3467/7474)
渡しているつもりの変数のECHOと $url = urldecode($_SERVER["REQUEST_URI"]); $japaneseorenglish = str_split($url); $counthensu = count($japaneseorenglish); $mbhensu = mb_strlen($url,'utf8'); 取り込み後の、ECHOがほしいですね。 if (strpos($_SERVER['REQUEST_URI'], '/honyarara/') === 0) { こっちは、含まれるか?なので、"=="ではないので、種類が違う判定でもありますね。 気になるのは、 $japaneseorenglish = str_split($url); http://www.php.net/manual/ja/function.str-split.php 1文字単位でばらしていますね。 $counthensu で、カウント?.length的値? その後、文字列の長さとして、入手? $mbhensu = mb_strlen($url,'utf8'); これを比較というのが、よくわからないのですが、 具体的に何を比較したいのでしょうか?
お礼
AsarKingChangさん、さっそくのご回答ありがとうございます。 要はURLに日本語が含まれているかどうかという判定を行っています。 "%82%d9%82%c9%82%e1%82%e7%82%e7" $urlは"ほにゃらら"みたいな形なのですが なにかお心当たりありますでしょうか。 よろしくお願いいたします。
補足
$url = urldecode($_SERVER["REQUEST_URI"]); $_SERVER["REQUEST_URI"]で "%82%d9%82%c9%82%e1%82%e7%82%e7" $urlはurldecode()で"ほにゃらら"みたいになってます。
お礼
To_aru_Userさん、ご回答ありがとうございました。 恥ずかしながらおっしゃる通りifの処理内における コーディングミスが原因でした。 結局自分の上記コードでも動作しましたし、 アドバイスいただいたコードでも動作を させることができました。 このたびは貴重なご回答いただきましてありがとうございました。