プロが教える店舗&オフィスのセキュリティ対策術

社内の掲示板に属するWebアプリケーションを制作しております。
複数のファイルをアップロードするために、<input type="file" ...>
で得たファイルのパスを一時的にリストに表示させる仕様になりました。
そこで、javascriptの正規表現オブジェクトで次のようなフルパスから
ファイル名のみを抽出することを考えました。
 a: c:\hoge.txt
 b: \\foo_server\foo_dir\hoge2.txt
a,bから、それぞれ
hoge.txt
hoge2.txt
を得るために、/[^\\].*/によって \\を取り除いた後で/\\.*\..*$/
によって欲しい文字列が得られると考えましたら文字列どころか何も
得られませんでした。
/[^\\].*/までは動いているようです。
オブジェクトの使い方が誤っていると考えているのですが、どの様に
扱えばよいのか皆目見当がつかなくなりました。
大変お手数ですが、ご教示願います。

A 回答 (6件)

なるほど、大体わかりました。

失礼ですが、正規表現をあまり把握されていないようですね。

正規表現は便利な反面少し難しいので、なれないうちはBLUEPIXYさんのおっしゃるような原始的な方法でがんばるほうがいいかもしれませんよ。

しかしそれでは質問に答えたことにはならないので、とりあえず回答します。

まずこれ
/[^\\].*/
これは、文字列の中から1文字目が\ではなくその後任意の文字が続くという意味です。そのため、この時点ですでにうまく動いていないはずだと思うんですけど…。

とりあえず私ならこうするよというソースを貼っておきます。これだけです。後ろから見て\以外の文字列のところだけ取る。簡単でしょ?

myRE = /[^\\]*$/;
result = fn.match(myRE);
alert(result);
    • good
    • 1
この回答へのお礼

ご教示大変ありがとうございました。
業務上迫られjavascriptの参考書首っ引きでコードを書いております。
仰るとおり正規表現につきましては軽くどころかカナリヤバイ状態です。
これを機に頭に叩き込む所存です。

お礼日時:2005/11/22 14:28

<input type="file" ...>で選択したファイルのパスって、JavaScriptじゃ取得不可だったように記憶してるんですけど、取れるの確認しました?



ちなみに、No.4の補足のスクリプトは、\\でなきゃいけないところが\になってるのがうまくいかない原因です。

ついでに、パスからファイル名の取り出しは、
var result = str1.split(/[\\\/]/).pop();
でもできますよ。これだとパス区切りが\でも/でもOKです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
おかげさまで解決しました。
今後十分生かしていけるようにします。

お礼日時:2005/11/22 14:18

>「\」全てが削除されて文字列が連結した状態になります。


substrとlastIndexOfでそんな動作にはなりません。
”「\」全てが削除されて”
というのは、多分、matchによるものだと思います。
ごっちゃにされませんように・

あと、いまさらですが、ファイルの階層の区切りはwindowsでは「\」ですが、他のシステムではそうとは限りません。UNIXやmac

この回答への補足

度々の回答ありがとうございます。お手数おかけしております。
ごっちゃにはしておりません。試した上で補足質問させて頂いております。
下記のコードで試しましたが、私のwindows環境では連結してしまいます

var str1 = "\\abcd\efgh\ijkl\mnop.txt";
var result = str1.substr(str1.lastIndexOf("\\")+1);
alert(result);

上のコードはBLUEPIXY様の試されたコードとは違う結果になるという
ことでしょうか。

補足日時:2005/11/22 12:50
    • good
    • 0
この回答へのお礼

おかげさまで解決しました。
回答ありがとうございました。<m(__)m>

お礼日時:2005/11/22 14:32

>lastIndexOfでは「\」は検索できないようです。


いや、使えますって、
IEとFireFoxで確認しましたが大丈夫でした。
var fn = document.strdata.upfile1.value;
var result=fn.substr(fn.lastIndexOf("\\")+1);
でいけると思います

この回答への補足

検索できないと記述しましたが、動かしてみますと
「\」全てが削除されて文字列が連結した状態になります。
必要なデータは最後の\の右側の文字列のみです。
このような結果になりまして、検索できないのかな…と考えました。

補足日時:2005/11/22 12:00
    • good
    • 0

まず、現状のソースを貼ってください。

この回答への補足

質問閲覧ありがとうございます。

var ele = document.createElement("option");
myRE = /[^\\].*/;
var fn = strdata.upfile1.value;
result = fn.match(myRE);
myRE2 = /\..*$/;
result2 = result.match(myRE2);
ele.value = fn;
var str = document.createTextNode(result2);

どうもmyRE2でおかしくなっているようです。
「\」がちゃんと扱えているのかどうかが怪しいところです。

補足日時:2005/11/22 10:09
    • good
    • 0

最後の「\」の後を取り出すなら


filename.substr(filename.lastIndexOf("\\")+1)
でいいと思います。

この回答への補足

回答ありがとうございます。
試してみましたが、lastIndexOfでは「\」は検索できないようです。
エラーとなりました。
lastIndexOfが使える代替文字などがあるのでしょうか。

補足日時:2005/11/22 09:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!