• ベストアンサー

JavaScriptの正規表現/?<.+?>/について

strからHTMLのタグを取り除いた文字列をxにしまうため var x=str.replace(/<.+?>/g,""); を使うそうですが /<.+?>/g をなぜ使うのかが分かりません /<.+>/g がまずいのは分かりますが・・・・ 教えていただければ幸いです

  • nubou
  • お礼率62% (293/470)

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.4

> 私の借りてきた本では「?の定義は直前の0回または1回の繰り返しにマッチ」となっていますが > この定義からどう解釈すれば ? は、「最短マッチ」の指定になるのでしょうか? ? には2つの用法があり、その1つが「直前のパターンの、0回または1回の繰り返し」と呼ばれているものです。 ? が * や + のような“繰り返し指定の直後”についている場合は「最短マッチ」の指定となります。 > 私の借りてきた本では「.は任意の1文字にマッチ」となっていますが > これは¥nや特殊文字は含まないのでしょうか? 試してみれば分かることですが、. は \n のみマッチしません。 (\t など、他の特殊文字はOK) 内容が間違っている本、説明が不十分である本も結構ありますから、たくさんの本やサイトから情報を集め、自分で正しいものを見つけることが大事です。

nubou
質問者

お礼

説明が抜けているみたいですね ?が0回から1回の繰り返しにマッチからどうしたら最短マッチということになるのだろうと悩んでいました ・が¥nにマッチしないというのを著者は度忘れしているのかもしれません ただ著者が悪いというよりも仕様のバグといったほうがいいかもしれませんね? ¥nだけ特別扱いするというのは混乱の元ですからね どうもありがとうございました

その他の回答 (3)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

> /<.+?>/g > をなぜ使うのかが分かりません なぜなら“カンタンだから”です。 もっとも、普通は /<[^>]*>/g ですが。 # 以下、解説 ● /<.+>/g について 既にお分かりのことを解説しても無意味かもしれませんが、 これがまずいのは、   str = "<B>ABC</B>"; のとき、“str全体にマッチしてしまう”からです。 正規表現で反復を指定する場合、通常は「最長マッチ」を指定したことになります。 つまり、.+ が B>ABC</B にマッチしてしまうのです。 ● /<.+?>/g について .+ の後ろの ? は、「最短マッチ」の指定です。 もっとも短いパターンでマッチさせるので、1回目のマッチでの .+ は B にマッチし、結果 <B> が削除されます。 g オプションにより、マッチするものがなくなるまで繰り返されるので、2回目で </B> が削除されます。 ● /<[^>]*>/g について なぜ /<.+?>/g ではまずかったかというと、. というのが“\n 以外の1文字にマッチする正規表現”だからです。 例えば、TEXTAREA の入力内容からタグを削除する場合、   <IMG src="・・・"    width=xx height=yy> のように、タグの途中に改行があった時に対処できないのです。 このため、普通はこちらを使います。 ただ、こんな簡単な方法では、完璧なタグの削除はできません。 高精度なものを求める場合、参考URLに、Perlでの正規表現(ほぼJavaScriptと同じ)でタグを削除する方法や注意事項が載っていますので、そちらをご参考ください。

参考URL:
http://www.din.or.jp/~ohzaki/perl.htm#Tag_Remove
nubou
質問者

補足

? は、「最短マッチ」の指定です: 私の借りてきた本では「?の定義は直前の0回または1回の繰り返しにマッチ」となっていますが この定義からどう解釈すれば ? は、「最短マッチ」の指定になるのでしょうか? 私の借りてきた本では「.は任意の1文字にマッチ」となっていますがこれは¥nや特殊文字は含まないのでしょうか? 詳しい解説助かりましたが上の2点について教えていただければ幸いです なお/<[^>]*>/g については分かりやすく理解できます

  • ryota2
  • ベストアンサー率43% (61/140)
回答No.2

/<.*>/g で良いんじゃない?

nubou
質問者

お礼

大きく解釈されて <p>abcdefghijklmnopqrstuvwxyz</p> を取り除くみたいです <p>と</p>だけを取り除きたいのです

回答No.1

こちらを覗いてみてください。 http://tohoho.wakusei.ne.jp/wwwjsreg.htm

参考URL:
http://tohoho.wakusei.ne.jp/wwwjsreg.htm
nubou
質問者

お礼

見ましたが解決しませんでした

関連するQ&A

  • Javascriptで特殊文字を置換する方法

    表題の件で分からず教えてください。 PerlでHTMLとJavascript(HTML埋め込み)を作成しています。 Javascript(On Click)で、文字列を置換させたいのですが、うまくできません。 (最終的にやりたいことはTextAreaに埋め込んだタグ付き文章を「プレビューする」ようなイメージです) ■置換前の文字列 $body$ ■置換後の文字列 任意の文字列(タグを含む) ネットで調べたところ次の方法でできるようだったので試しましたが、できませんでした。 var rgexp = new RegExp("\$body\$", "g"); str = frm.preview.value.replace(rgexp, "■■■"); 「$」とエスケープ文字をはずすとうまくいくので、多分「$」で失敗しているのだと思いますが 解決が分かりません。 ※エスケープをはずすとPerlの出力時に怒られてしまいます お分かりになる方いらっしゃいましたらお願いします。

  • 正規表現をまとめることってできますか?

    正規表現をまとめるにはどうしたらよいでしょうか? var str = document.forms[0].school_list.value; if (str == "") return; var result = ""; for (var i = 0; i < str.length; i++) result = str.replace(/,/g,'\n'); document.forms[0].result_school_list.value = result; document.forms[0].result_school_list.select(); var str = document.forms[0].result_school_list.value; if (str == "") return; var result = ""; for (var i = 0; i < str.length; i++) result = str.replace(/、/g,'\n'); document.forms[0].result_school_list.value = result; document.forms[0].result_school_list.select();

  • JavaScriptのreplace関数について

    文字列 var str="g.ii,g.txt,as.jpeg,ssss,jpg,s.jpg,xyz.gif,zzz.gif,sy.imag"; (実際はもっと長く同じものがいっぱいある) において文字列 var word; //<-----example:word="xyz.gif"; にはいっている文字を除去したいのですがどうしたらいいのでしょうか? wordは文字列であって正規表現でないので str=str.replace(word,""); にはできそうもないし・・・・

  • [javascript]</TDと</TR以外で始まるHTMLタグを消去する正規表現

    HTML形式の文字列から</TDと</TRで始まるタグ以外を消去したいのですが、以下の記述ではうまくいきませんでした。 test = test.replace(/<\/T[^RD][^>]*>/g,""); どのように記述すればよいでしょうか?

  • perlでの正規表現について

    文字列のなかの"<タグ>(アルファベット1文字)"すべてに対して置換処理をさせたいのですがうまく動作しません。 現在はこう記述しております。 $str=~ s/(~<(.*?)>\w)/置換文字列/g; 良い方法があれば教えていただけると助かります。

  • javascriptに関する質問です

    javascriptに関する質問です タグの"<",">"を入力したら"&t","&gt"に置き換えまた(ダブルオークション)を入力したら&qut ""また(空白)を入力したら&mbsp;また"&"を入力したら&ampに置き換えるjavascriptを作りたいのですがいまいちどう作ればいいのか方向が分かりませんどなたかご教授ください 個人としてはremoveTagを使い変更したいですがなかなかうまくいきません どなたかご教授ください !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=Shift_JIS"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>タグを置き換える</title> <script language="JavaScript" type="text/javascript"> <!-- function removeTag() { var str = document.myForm.before.value; var newStr = str.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;').replace(/\s/g,'&nbsp;'); document.myForm.after.value = newStr }

  • 正規表現内に変数を使用する方法

    match() や replace() の第1引数に文字列ではなく正規表現を使用 できますがこの正規表現内に変数を使用する場合、どうやったらよいの でしょうか。 var str = 'てすと'; alert(str.replace(/str/, 'テスト')); とすることができません。 (Perlではパターン内に変数が使用できるのですがJSでは変数が使用 できません) http://ar.aichi-u.ac.jp/blog/js-replace.html に書いてあるように第1引数に文字列を渡すと正規表現ではなくただの 文字とのマッチになってしまうようなので(確認済み)使えません。 面倒ですがリンク先にあるようにnew RegExpでRegExpオブジェクトを 作ってやる方法しかないんでしょうか。

  • js 正規表現

    下記のhtmlをinnerHTMLで取得しました。センチメートルからtd閉じタグの<の一つ前までの文字を削除したいです。str.replace(/セ.+</g<, ''<") こちらを試しましたが削除できませんでした。 よろしくお願いします。 "<td>22センチメートル 234234; ? (概算)34 </td> <td>23センチメートル 234234; ? (概算)93 </td> <td>24センチメートル 234234; ? (概算)645fail </td> <td>25センチメートル 234234; ? (概算)627 </td>"

  • javascriptの正規表現で重複して検索

    javascriptの検索において、検索パターンを正規表現で指定し、gオプションで全検索とした場合です。 1度目にマッチした文字列のうち一部が、後に続く別の文字列と組み合わさると、新たに検索パターンとマッチする場合、これについてもマッチさせる方法はないでしょうか。 var x = 'ペンギン3年4月5日'.match(/\D\d[年月日]/g); document.write( x ); これを実行すると、 「ン3年」 しか表示されませんが、 「ン3年」「年4月」「月5日」 の3つとも表示させるようにしたいのです。

  • replaceでの正規表現の記載について教えて下さい。

    replaceでの正規表現の記載について教えて下さい。 replaceを用いてt2の文字列をclpreの文字を対応するclaftの文字に変更することを考え、下記のようにくんでみましたが、エラーが出てしまい上手く行きません。 正しくはどのように記載するのでしょうか? ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー var t2 = "KJANN B CVA"; clpre = new Array("A" , "B" , " ", " "); claft = new Array("@" , "*" , "s" , "S"); for (i=0; clpre[i]; i++){  t2 = t2.replace(/clpre[i]/g, claft[i]); } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー