PHPの質問です

coreserverです 以下の様なフォルダ構成になっています
======================
hoge.php
hoge
 |_a.php
 |_あ.php
======================

hoge.php
======================
<?php
foreach(glob('hoge/*.php') as $f) {
echo "<a href=\"http://hoge.jp/$f\">".basename($f,'.php')."</a>";
}
?>
======================

hoge.phpを実行しますと以下の様に英文字のファイルはきちんと表示されますが日本語ファイルはきちんと表示されません

<a href="hoge.jp/a.php">a</a>
<a href="hoge.jp/あ.php">.php</a>

どのようにすればいいでしょうか?

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2014/09/06 04:20:58
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:takanii

今調べました所 頭文字に英文字が使われていると 例:aあ.php などは表示されます

ベストアンサー

id:jislotz No.1

回答回数19ベストアンサー獲得回数7

ポイント500pt

basename() はマルチバイトが含まれていると失敗するそうです。
http://php.net/manual/ja/function.basename.php
setlocale() でロケールを設定する方法が紹介されていますが、
それもちょっと難があるような。

echo "<a href=\"http://hoge.jp/$f\">".mb_substr(mb_strrchr($f, "/"), 1)."</a>";
こういう感じでファイル名の切り出しを他の文字列操作関数でやってしまうのが
いいんじゃないでしょうか。

他2件のコメントを見る
id:takanii

でいけました
ありがとうございました!

2014/09/06 04:20:50
id:jislotz

コメント書こうと思ったら、自己解決できたようですね。

拡張子が.phpじゃない時も対応したくなるとその方法では困るかもしれないので、
そういうときはexplode()で
foreach(glob('hoge/*.php') as $f) {
$filename = explode('.', mb_substr(mb_strrchr($f, "/"), 1));
echo "<a href=\"http://hoge.jp/$f\">".$filename[0]."</a>";
}
とか。微妙なコードですね。
preg_replace()を使うのがいいかもしれないし、もっといい方法があるかもしれません。

2014/09/06 04:42:33

その他の回答0件)

id:takanii

質問文を編集しました。詳細はこちら

id:jislotz No.1

回答回数19ベストアンサー獲得回数7ここでベストアンサー

ポイント500pt

basename() はマルチバイトが含まれていると失敗するそうです。
http://php.net/manual/ja/function.basename.php
setlocale() でロケールを設定する方法が紹介されていますが、
それもちょっと難があるような。

echo "<a href=\"http://hoge.jp/$f\">".mb_substr(mb_strrchr($f, "/"), 1)."</a>";
こういう感じでファイル名の切り出しを他の文字列操作関数でやってしまうのが
いいんじゃないでしょうか。

他2件のコメントを見る
id:takanii

でいけました
ありがとうございました!

2014/09/06 04:20:50
id:jislotz

コメント書こうと思ったら、自己解決できたようですね。

拡張子が.phpじゃない時も対応したくなるとその方法では困るかもしれないので、
そういうときはexplode()で
foreach(glob('hoge/*.php') as $f) {
$filename = explode('.', mb_substr(mb_strrchr($f, "/"), 1));
echo "<a href=\"http://hoge.jp/$f\">".$filename[0]."</a>";
}
とか。微妙なコードですね。
preg_replace()を使うのがいいかもしれないし、もっといい方法があるかもしれません。

2014/09/06 04:42:33
  • id:yoneto164
    glob()はマルチバイト文字に対応しません。
    UNIXサーバーなら上手く行くという噂はありますが。
    http://www.freeshow.net.cn/ja/questions/b02e406bdf6c9a3bd94e85eef3c750f43807483d82523656917e22dafb938424/

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません