プロが教えるわが家の防犯対策術!

JavaScriptで?や|などのメタ文字をエスケープするために\をつけるよう変換したいのですが、?を置換する場合replaceを使って\?にできたのですが例えば????や|||など連続させると\????と最初だけエスケープされます。これを\?\?\?\?のように変換するにはどうすればよいのでしょうか?また\のエスケープ方法なんかも教えてください。
説明が変で申し訳ありませんが、なかなか上手く変換できず困っています。

PS
カテゴリが違いますがJavaScriptでなく、Perlで簡単に可能な場合はPerlでのやり方などもぜひご教授ください。
お願い致します。

A 回答 (3件)

#2です



\マークに関しては、通常string型のリテラルとして変数に代入する場合、エスケープが必要です
なので、まず変数の代入の時点で

//例 変数str に ?|\ という文字列を代入させたい場合
str = "?|\\";

となります
まずここがエラーの原因になっている可能性の一点目

そしてもうひとつが、RegExp内です
前回説明したようにRegExp -> replaceと渡るので"エスケープの\"を表すためにも更にエスケープが必要です
jsの (\\?|\\|) とperlの (\?|\|) を比べるとわかりやすいですが、\が倍必要になるということです

replace内でエスケープではない文字列の\マーク
=1点目で挙げたように \\ を渡したいので、
RegExp内では\\両方をエスケープしてあげる必要があります
つまり、めんどくさいことになりますが、\\\\ となるわけです

前回の内容を変えてまとめると

//
str = "?|\\";//= ?|\
document.write(str + " → ");//試し書き用
str = str.replace(new RegExp("(\\\\|\\?|\\|)","g"),"\\$1");
document.write(str);
//

となります
RegExp内の(\\\\|\\?|\\|)がreplaceで(\\|\?|\|)として扱われるということです
このreplaceでの扱われ方とperlでのマッチパターンの書き方が共通項となります
$str =~ s/(\\|\?|\|)/\\$1/g;### 例
    • good
    • 0
この回答へのお礼

たびたび回答ありがとうございます。
試した結果ばっちり上手くいきました!
また1つよい勉強ができました。
本当にありがとうございました。

お礼日時:2007/08/10 22:15

javascriptはRegExpが用意されているのでreplaceにそちらを使うと便利です



//
str = "???||||?|?||";
str = str.replace(new RegExp("(\\?|\\|)","g"),"\\$1");
document.write(str);
//

RegExp -> replace と流れるので、RegExp内では
エスケープ用の\に更にエスケープ(\\?と\\|部分)が必要になります
"g"は繰り返し実行、$1は RegExp内()部分=マッチした内容の後方参照です
エスケープされていない | は、複数条件用で「又は・もしくは」を意味します

perlなら

$str = "???||||?|?||";
$str =~ s/(\?|\|)/\\$1/g;
print $str;

のような感じです

この回答への補足

回答ありがとうございます。
早速試した結果見事エスケープに成功しました!
本当にありがとうございます(しかもPerlまで)。

しかしこの方法でやってみたら\マークは上手くエスケープできなかったのですが\マークは他に特別な方法でエスケープするものなのでしょうか?それとも自分のやり方が悪いのか・・・w
気が向いたぜひ教えてください。お願いします。

補足日時:2007/08/09 22:43
    • good
    • 0

JavaScriptだとちょっと手を加えることになるようです。


http://www.altum.jp/js/41.txt
    • good
    • 0
この回答へのお礼

回答およびURLどうもありがとうございました。
もっと勉強し、精進します。

お礼日時:2007/08/09 22:43

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