JavaScriptで連続する空白を、htmlタグ付きで別の文字の連続に置換する方法

このQ&Aのポイント
  • JavaScriptで連続する空白を、htmlタグ付きで別の文字の連続に置換する方法について教えてください。
  • 現在は正規表現を利用して置換していますが、よりシンプルで効率的な方法があれば教えてください。
  • また、最終的に処理する文字列が多い場合でも、置換後の文字列を小さく保持する方法があれば教えてください。
回答を見る
  • ベストアンサー

JavaScriptで連続する空白を、htmlタグ付きで別の文字の連続

JavaScriptで連続する空白を、htmlタグ付きで別の文字の連続に置換する方法 ※可視化のため下記のサンプルでは、空白を「_」で表現しています 「_」の連続を、「#」の連続とそれをタグで囲んだ状態にしたいと思っています。 やりたいことはこんな感じです。 (0):置換前:hoge_hogehove___asd#bn__ (1):置換後:hoge<span class="…">#</span>hogehove<span class="…">###</span>asd#bn<span class="…">##</span> しかし正規表現の書き方が分からなかった為、現状のコードはこんな感じにしています。 str.replace(/_/g, "<span class='…'>#</span>"); 実行結果はこうなります。 (2):現状:hoge<span class="…">#</span>hogehove<span class="…">#</span><span class="…">#</span><span class="…">#</span>asd#bn<span class="…">#</span><span class="…">#</span> 無駄に長いのですがとりあえず現状でも、htmlとして表示したときの結果は間違っていません。 しかし ・正規表現を十分に理解できていないレベルの低いコードっぽい ・最終的には比較的多くの文字列を処理をする ・保持しておいて繰り返し表示するので置換後の文字列を小さくしておきたい と思っています。 (0)を(1)の状態に変換する方法を教えてください。 出来れば正規表現でシンプルにパシッと決める方法を希望しています。 よろしくお願いします。

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

  • ベストアンサー
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.6

// JavaScript 1.3, Jscript 5.5, ECMA 262-3 'hoge_hogehove___asd#bn__'.replace(/_+/g, function(s) { return '\x3Cspan class="hoge">' + s.replace(/_/g, '#') + '\x3C/span>'; });

mibusys
質問者

お礼

試したところ期待通りに動きました。 すごいです。こんな書き方が出来るのですね。 私が心の奥で求めていた方法と一致します。 今回は本当に質問してよかったです。 比較的短時間に、複数の方にいろいろな方法を 教えていただけ大変勉強になりました。 ありがとうございました。

mibusys
質問者

補足

「\x3C」とありましたが、「\x3C」でも「<」でも大丈夫でした。 環境を書き忘れていましたが、WinXP IE8 HTAとして実行です。 環境によって「\x3C」でなければならない場合もあるのですかね? とりあえず、私の環境では大丈夫でしたが、汎用的な環境を想定し ご回答をいただいたのかと思います。 本当に参考になりました。ありがとうございました。

その他の回答 (8)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.9

No3です。 >1回目の置換でつけたspanタグ内の空白も置換してしまった為、 >希望の動きにはなりませんでした。 ありゃ、うっかりしてました。 そうですね。 すでに、No4様が回答なさってますが、それを応用させて頂いて… (できそうな気がしてたんだけど、引数で受ける方法が分からなかった<お勉強させて頂きました) var str = "hoge_hogehove___asd#bn__"; str=str.replace(/(_+)/g, function(s){return '<span class="…">'+s.replace(/_/g,'#')+'</span>';}); alert(str); で、いけるみたい。(IE6でもOKでした)

mibusys
質問者

お礼

ANo.6さんの内容と同じですね。 回答タイミングの差かもしれませんが。 今回はいろいろ勉強になりました。 ありがとうございました。

回答No.8

連続済みません。 No.7は#が1つしかないので、No.6のようにしないとダメですね。 別の方法で。 str=str.replace(/(_+)/g, function(s){return '<span class="">'+Seq(s,s.length)+'</span>';}); var Seq=function(s, n){var r='';while(n){r+=s;n--};return r;}; var Seqをreplace中の無名関数に入れても動くはずですが、遅くなります。

mibusys
質問者

お礼

試してみましたが、そのままではダメでした。 しかし新たな提案を試みていただき ありがとうございました。

回答No.7

#に変換を忘れていました。 str=str.replace(/(_+)/g, function(s){return '<span class="">#</span>';});

mibusys
質問者

お礼

試してみましたが、そのままではダメでした。 しかし新たな提案を試みていただき ありがとうございました。

  • infeeld
  • ベストアンサー率37% (3/8)
回答No.5

一旦スペースをキーボード入力できない文字に変換するのはどうでしょう。 var str = "hoge hogehove asd#bn "; //スペースを「\0」に置換 str = str.replace(/ /g, "\0"); //後方参照にて「\0+」にspanタグのプレフィックスとサフィックスを追加 str = str.replace(/(\0+)/g, "<span class='…'>$1</span>"); //「\0」を「#」に変換 str = str.replace(/\0/g, "#"); alert(str); 一行で書いても構いません。

mibusys
質問者

お礼

私の最初のコードで得られる結果よりはるかにいい方法ですね。 ただ、3回の置換は少し冗長に感じます。 ただ、「\0」でいったん退避するという方法はユニークであり 参考になりました。ありがとうございました。

回答No.4

str=str.replace(/(_+)/g, function(s){return '<span class="">'+s+'</span>';}); これでどうでしょうか。 _ を半角スペースに変換して下さい。(1カ所) Ajax未対応ブラウザ、IE5.5、IE6で動かないかもしれません。

mibusys
質問者

お礼

第二引数に関数を指定できるんですね。 知りませんでした。 この方法を知ったことで、私の対応能力がだいぶ高まったと思います。 大変勉強になりました。ありがとうございました。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

もっとうまい方法があるかも知れませんが… var str = "hoge_hogehove___asd#bn__"; str = str.replace(/(_+)/g, "<span class='…'>$1</span>").replace(/_/g, "#"); alert(str);

mibusys
質問者

お礼

うわ。これですね。 普通に2段階で置換すればいいだけだったんですね…。 意味合い的にも最も適しているように感じます。 難しく考えすぎていたのかもしれません。 大変参考になりました。ありがとうございました。 ※てか、皆さんのご回答が早くてびっくりしています。 今回は本当に、質問してよかったです。

mibusys
質問者

補足

いけたと思ったのですが、「_」はあくまでも空白であるため1回目の置換でつけたspanタグ内の空白も置換してしまった為、希望の動きにはなりませんでした。 仕方がないので最後に「.replace(/span#class/g, "span class");」を入れ、3発置換にしました。 しかしこれだと最初の文字列の段階で「span#class」という文字列があった場合には意図せぬ置換を行なうことになってしまいます。が、実際にはまずないであろうと思われる文字列なので、とりあえずはいいことにしました。 質問前は「無理かも」と思っていたのですが意外といろいろな案が出てくるので、もしかしたらさらなる良案が出てくるかもしれないので、もう少し様子を見させていただきます。

  • chie65535
  • ベストアンサー率43% (8512/19351)
回答No.2

追記。   冗長部分を取り去る際に無関係な他のタグまで置換しちゃうと困るので、以下のようにしましょう。   1.一旦、未定義タグを追加する str.replace(/_/g, "<xxst>#<xxed>");   hoge_hogehove___asd#bn__ ↓ hoge<xxst>#<xxed>hogehove<xxst>#<xxed><xxst>#<xxed><xxst>#<xxed>asd#bn<xxst>#<xxed><xxst>#<xxed>   2.冗長部分を削除する str.replace(/<xxed><xxst>#/g, "#");   hoge<xxst>#<xxed>hogehove<xxst>#<xxed><xxst>#<xxed><xxst>#<xxed>asd#bn<xxst>#<xxed><xxst>#<xxed> ↓ hoge<xxst>#<xxed>hogehove<xxst>###<xxed>asd#bn<xxst>##<xxed>   3.未定義タグを本来のタグに置き換える str.replace(/<xxst>/g, "<span class='…'>"); str.replace(/<xxst>/g, "</span>");   hoge<xxst>#<xxed>hogehove<xxst>###<xxed>asd#bn<xxst>##<xxed> ↓ hoge<span class="…">#</span>hogehove<span class="…">###</span>asd#bn<span class="…">##</span>   正規表現の指定時に「/」記号を使用するので「途中結果では『/』を含まない文字列を使って、最後の最後で『/』を含む文字列に置換している」と言う事に注意すること(そうしないと正規表現の置換元の文字列の指定がメンド臭い事になる)

mibusys
質問者

お礼

追加で別の方法も考えていただきありがとうございました。 今回はいろいろ勉強になりました。

  • chie65535
  • ベストアンサー率43% (8512/19351)
回答No.1

>(2):現状:hoge<span class="…">#</span>hogehove<span class="…">#</span><span class="…">#</span><span class="…">#</span>asd#bn<span class="…">#</span><span class="…">#</span>   文字列「hoge<span class="…">#</span>hogehove<span class="…">#</span><span class="…">#</span><span class="…">#</span>asd#bn<span class="…">#</span><span class="…">#</span>」の「</span><span class="…">#」を正規表現の置換を使って「#」に置換したらどうなりますか?   冗長になるのが判っているなら、冗長にしたあとで、冗長部分を削除すれば良いでしょう。   そりゃ「一発で冗長部分を作らずに最適な置換をする」と気持ち良いですが「結果が最適化されてりゃ、途中はどうでもいい」と思いませんか?

mibusys
質問者

お礼

おお。逆転の発想といいますか、私には無かった発想です。 正規表現での置換を1行追加しただけで実現できました。 「一発」ではありませんが、私が質問で掲げた「シンプルにパシッ」 には十分該当する解決策だと思います。 私が抱えている課題は一旦解決しました。 しかしそれ以上に、行き詰まったときには 少し違った角度からアプローチしたり、考え方を変えてみたりすると 出口が見える(場合もある)という好例を学ばせていただきました。 大変参考になりました。ありがとうございました。

関連するQ&A

  • 正規表現で <span>~</span>で囲まれた文字を別の文字に置換したい

    こんにちは。正規表現についてお教えいただけないでしょうか? HTMLページを解析し、<span>と</span>で囲まれた範囲を、別の文字列に置換したいのです。 そこで以下のようにしてみました。 print mb_ereg_replace("<span>.+?</span>","置換文字",$source); しかし<span>ああ </span>と、スペースがないと反応しないようなのです。 正規表現の間違いでしょうか? お教えいただけると助かります。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現で特定のHTMLタグのクラスから文字列を取り出したい

    はじめまして。 現在PHP勉強中の者です。 タイトル通りクラス付けされたHTMLタグ内の文字列を取り出したいのですが、上手くいかず困ってます。 利用サーバーはコアサーバーで環境は下記通りになります。 apache:1.3.37 PHP:5.2.5 スクリプトはUTF-8、HTMLもUTF-8です。 タグは<span class="hoge">文字列</span> のような感じです。 preg_match_all("/<span class=\"hoge\">(.*)</span><\/em>/", $html, $results); こんな感じでやってるんですが引っ掛かりません。。。 よろしくお願いします。

    • 締切済み
    • PHP
  • 2つ以上の連続する空白文字を除去

    フォームから受け取った値の中の2つ以上の連続する空白文字を削除したいのですがどうすればいいでしょうか。 一つは区切り文字として残したいのです。 調べてみたところ splitで正規表現するとできる というサイトを見たのですが具体的に書かれていなかったのでよくわかりませんでした。 わかる方お願いします。

    • ベストアンサー
    • PHP
  • 文字列の<>で囲まれた文字列を一括削除する方法

    サイトのソースで、本文に<br>、</div>などのHTMLタグが挿入されていますが、 これらのタグを一括して削除する方法はないでしょうか。 私が最初に試したのは、ソースをメモ帳に張り付けて、置換機能を利用して ワイルドカードを使い、<*>の文字列を空白に置き換える方法ですが、 上記のようなタグがあるにも関わらず、該当する文字列がないと エラー表示され置換できません。 具体的には、以下のように編集したいです。 (置換前) <div class="t_h ">7: <span style="color: green; font-weight: bold;">名無しさん</span> <span style="color: gray;"> 2013/09/26(木) 15:55:59.62 ID:FahaifvL0</span></div> <div class="t_b " > 山田太郎だったら営業に有利そうだな </div><br /> (置換後) 7: 名無しさん2013/09/26(木) 15:55:59.62 ID:FahaifvL0 山田太郎だったら営業に有利そうだな どなたかいい方法を教えていただけますでしょうか。 よろしくお願いします。

  • Javascriptで正規表現を使って HTMLタグの[id="hea

    Javascriptで正規表現を使って HTMLタグの[id="header-nav"]のような文字列がある場合に[id="headerNav"]というように一斉に置換するにはどういったふうに書けば良いでしょうか?

  • タグにはさまれている文字以外を置換したい

    あるマルチバイト文字列に対して、特定の文字を正規表現で置換したいのです。 そのマルチバイト文字列には、htmlの<a>タグが混じっています。(混じっていない場合もあります。) 置換したいのは、<a>タグで囲まれている文字以外の文字なのですが、正規表現としてどのようなパターンにすれば出来るのか悩んでおります。 ------------------------------------------------- //置換前のマルチバイト文字列 "朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い" //検索・置換対象となる文字列 "コーヒー" //置換を行う文字列 "紅茶" //置換後のマルチバイト文字列 "朝一番の紅茶は<a href="index.html">3時のコーヒーや</a>食後の紅茶より旨い" ------------------------------------------------- ↓こちらを参考にしてみたのですが、ちょっとやりたいことと違うみたいでうまくいきませんでした。 http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside ================================================= $string = "朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い" $pattern = '/((?:\G|>)[^<]*?)コーヒー/'; $result = mb_ereg_replace($pattern, '\1紅茶', $string); echo $result; ================================================= 是非、皆様に力を貸して頂きたく、どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • Excel : タグ付き正規表現による文字置換は可能?

    アクティブセルの文字を、正規表現を利用して文字置換をしたいと考えています。 ただ、単純な文字置換ではなく、正規表現にマッチした文字列を記憶して、 置換後の文字列として呼び出して利用します。 秀丸エディタにあるような「タグ付き正規表現」を利用したいです。 Excelでも同じようなことは可能なのでしょうか? 一例として挙げますと、次のような文字置換です。 ●「?」の後に全角スペース以外の文字がある場合には、「?」の後に全角スペースを1つ入れる。 ●「?」の後に全角スペースが複数続く場合には、「?」の後の全角スペースを1つだけにする。 つまり、★を全角スペースとすると、次のようになります。 あいう?あいう   → あいう?★あいう あいう?★★あいう → あいう?★あいう さらに、一例を挙げますと、 ●「AさんはBさんの友達です」というような文章を、「BさんはAさんの友達です」にする。  つまり、AとBに相当する部分を入れ替える。 よろしくお願いいたします。

  • HTMLタグの中に文字参照は書いても良い?

    文字列中のHTMLタグを文法チェックする正規表現を考えています。 HTMLのバージョンは4.01 Transitionalを想定しています。 悩んでいるところが文字参照の&nbsp;でして、これはタグの中でも 空白を表すのかどうかという点です。 つまり、以下のタグはタグとして正しいかどうかということです。 (例1) <p&nbsp;id="hoge">aaaaa</p> (例2) <p &nbsp; id="hoge">aaaaa</p> ブラウザでタグとして認識されないので、恐らく誤りなのかなと 思っており、The W3C Markup Validation Serviceや Another html-lint GatewayでもNGと指摘されますが、理由を 仕様として把握したいと考えています。 なんとなく、漠然と仕様上書けないような気はしているのですが、 そのエビデンスがほしいのです。 「この仕様にこう書いてある。だから書けない」と言えれば よいのですが、その在り処がお分かりになる方、ぜひ教えて頂けますか。

  • 空白文字の正規表現

    お世話になります。 StringクラスのreplaceAllを使用して、文字列に含まれる空白を削除しようとしているのですが、空白文字の正規表現がおかしいらしく「エスケープ・シーケンスが無効です」とエラー文が表示されてしまいます。 空白文字の正規表現は「\s(バックスラッシュs)」でよろしかったでしょうか? 使用しているjreは1.6.0でした。 ご回答お願いいたします。

    • ベストアンサー
    • Java
  • 正規表現でタグの一部を削除したい

    Dreamweaverの検索および置換で正規表現を使用して、サイト内で使用されている<a>タグの中の「title=""」を削除したいです。どうぞよろしくお願いします。 例としては下記のような感じです。 【修正前】 <a title="ここは文字列が入っています" href="index.html" class="link">リンク文字</a> 【修正後】 <a href="index.html" class="link">リンク文字</a> 「title=""」の「””」に入っている文字列は同じ文字もありますが、基本的にすべて違います。 また、例では<a>タグの中に「href」「class」が入っていますが、リンク先が違ったり、class名が違ったり、「id」が入っていることもあります。

    • ベストアンサー
    • CSS

専門家に質問してみよう