がんばって調べているんですが、わからないので質問します。
HTMLでのメタキャラクタ(「<」「>」「&」「"」など)を
エスケープしたいんですが、うまくいきません。
試した内容は、こんな感じです。
Stringクラスのreplace(char oldChar, char newChar)
を使えば、上手くいくかなと思ったのですが、文字列の
長さが変わってしまう為、使えませんでした。
1文字と1文字の変換だとうまく行くのですが、今回の
場合、1文字を4文字に変換したい為、使えません^^;
< → <
次に考えたのが、文字列のバッファの長さを増やせる
Stringbufferクラスの
replace(int start, int end, String str)
だと、位置を指定しなければならなくて、どうやったら
良いのかわかりません。
みなさん、どのようにしているのでしょうか?
考え方、サンプルなどありましたら、アドバイスお願いします。
No.1ベストアンサー
- 回答日時:
> Stringbufferクラスの
> replace(int start, int end, String str)
> だと、位置を指定しなければならなくて、どうやったら
> 良いのかわかりません。
位置は探してゆけば良いですね。例えば、こんな感じ。
StringBuffer buf = new StringBuffer(対象の文字列);
for (int i = 0 ; i < buf.length() ; ++i) {
if ( buf.charAt(i) == '<' ) {
buf.replace(i, i+1, "<");
i += 3;
}
}
もっとスマートな解が在りそうな気がするので、自信無しとして置きます (^^;
標準の範囲を超えてしまいますが、参考URLのようなライブラリを使えればメソッド一発ですね。
参考URL:http://www.ingrid.org/jajakarta/regexp/jakarta-r …
この回答への補足
素早いご回答ありがとうございます。
考え方がすごいわかりやすかったです。
そして、さらに質問になりますが、「i+=3」の部分
なんですが、「<」って4文字なんで、「i+=4」
にならないのでしょうか?
微妙に混乱しています^^;
また、色々なメタキャラクタをエスケープするように
作ってみました。現在、「クロスサイトスクリプティング」に
ついて対策を考えているのですが、ひとつわからない事が
あります。
「<」「>」「&」「"」の四つの文字については、
エスケープに成功しました。しかし、「'」(シングル
クォーテーション)だけは、エスケープできません。
画面に「'」と出てしまいます。(IE5.5で確認)
シングルクォーテーションのエスケープの仕方が間違って
いるんでしょうか?
それとも、シングルクォーテーションは、普通エスケープ
しないのでしょうか?
クロスサイトスクリプティングの場合は、シングルクォーテーション
は、エスケープしなくても良いのでしょうか?
かなりたくさん、質問となってしまいますので、ご存知
の部分だけでもわかりましたら、よろしくお願いします。
あと、作成したソースを載せますので、書き方などの
注意もありましたら、よろしくお願いします。
try{
for(int i = 0 ; i < sb.length() ; ++i){
if(sb.charAt(i)=='<'){
sb.replace(i, i+1,"<");
i+=3;
}
if(sb.charAt(i)=='>'){
sb.replace(i, i+1,">");
i+=3;
}
if(sb.charAt(i)=='&'){
sb.replace(i, i+1,"&");
i+=4;
}
if(sb.charAt(i)=='\''){
sb.replace(i, i+1,"'");
i+=5;
}
if(sb.charAt(i)=='<'){
sb.replace(i, i+1,""");
i+=5;
}
}
}catch(IndexOutOfBoundsException ioobe){
}
補足部分で、足りない部分と、間違いがあったので、
お礼に書かせてもらいます。
あわてんぼうで、すいません^^;
String str = "<script>test</script>犬&猫<a href=\"http://www.aaa.com\">AAAA</a>";
StringBuffer sb = new StringBuffer(str);
try{
for(int i = 0 ; i < sb.length() ; ++i){
if(sb.charAt(i)=='<'){
sb.replace(i, i+1,"<");
i+=3;
}
if(sb.charAt(i)=='>'){
sb.replace(i, i+1,">");
i+=3;
}
if(sb.charAt(i)=='&'){
sb.replace(i, i+1,"&");
i+=4;
}
if(sb.charAt(i)=='\''){
sb.replace(i, i+1,"'");
i+=5;
}
if(sb.charAt(i)=='\"'){
sb.replace(i, i+1,""");
i+=5;
}
}
}catch(IndexOutOfBoundsException ex){
}
No.3
- 回答日時:
個人的にHTMLタグを変換する機会が多いので、以下のような関数を
持ったクラスを作って利用してます。
単純にif~elseになるべきところを、switchを使っているだけですが。。。
static public String replaceTag(String argOriginalStr) {
StringBuffer returnStr = new StringBuffer();
for (int i = 0; i < argOriginalStr.length(); i++) {
char ch = argOriginalStr.charAt(i);
switch(ch) {
case '<':
returnStr.append("<");
break;
case '>':
returnStr.append(">");
break;
default:
returnStr.append(ch);
break;
}
}
return new String(returnStr);
}
ご回答ありがとうございます。
switchで条件分岐するやり方もありましたね!
ほんと、勉強になります。
if文は、結構使用しますが、switch文は、if文に
比べると使用頻度が少なく思います。
ちょっと忘れ気味でした。
No.2
- 回答日時:
> そして、さらに質問になりますが、「i+=3」の部分
> なんですが、「<」って4文字なんで、「i+=4」
> にならないのでしょうか?
for() で +1 されるので、+=3 としています。考え方は4文字だから4増やすで良いです。
> しかし、「'」(シングル
> クォーテーション)だけは、エスケープできません。
「お礼」にあったソースで良いと思いますけどね。シングルクォートもきちんと変換できますよね。
ただ、StringBuffer#replace() で置換した後の i を増やすところでは、";" を指しているので、
if の連続ではなく、if ~ else if と続けた方が良いかも。これでも大丈夫ですけど。
またまた、回答ありがとうございます。
>for() で +1 されるので、+=3 としています。
あっ!なるほどです。
合計4増えるんですね。
一人で考えてたら、+=4にして、失敗する所でした。
if~elseの方がいいかもしれませんね。
if~elseに変えて、使ってみたいと思います。
大変、勉強になりました。
最後まで、付き合って頂いて、感謝しております。
ありがとうございました。
「a-kuma」さんの名前は、「あ~熊さん」なのか、
「ええ熊さん」なのか、すごい気になりますが、
「ええ熊さん」だと思っておきます。
「優しい熊さん」という意味で。
すぐに締め切っても良いのですが、他の方で違った
アドバイスがあるよって人がいるかもしれませんので、
明日締め切らせていただきます。
ご了承ください^^
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- Perl perlについての質問 2 2022/10/17 15:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
int型のゼロ埋め
-
javascriptで文字列のsjis利用...
-
Path型をString型へ変換する(Java)
-
C言語32bitから64bitの移行につ...
-
カタカナをローマジに変換する。
-
javaの初歩的な質問です。
-
Visual Studio 6.0でビルド可能...
-
replace関数で複数の文字の変換...
-
javaでのOracleのデータ登録の...
-
javaの文字コード変換について
-
byte配列をImageに変換する
-
文字リテラルについて
-
TEXTAREAからのデータを改行入...
-
byte[] を long,float とかに...
-
JIS8の半角かな文字をUnicodeの...
-
カタカナ変換
-
タイピングゲーム作成中 複数...
-
数字を読みに変換する方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
Path型をString型へ変換する(Java)
-
カタカナをローマジに変換する。
-
javascriptで文字列のsjis利用...
-
int型のゼロ埋め
-
Visual Basic でのコードをASCI...
-
文字列の比較
-
COBOLで半角カナを全角カナに変換
-
JavaのStringクラスに「外字」...
-
C言語32bitから64bitの移行につ...
-
byte[] を long,float とかに...
-
UTF-8とUnicodeの互換性
-
[Javascript]エンターキー押下...
-
エクセルVBAで「〜」が表現でき...
-
Windows-31Jからutf-8への変換...
-
substring バイト単位でやりたい
-
IBM漢字コード⇒SJIS変換方法
-
byte配列をImageに変換する
-
Arduino(C言語) String "1101" ...
おすすめ情報