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)の状態に変換する方法を教えてください。
出来れば正規表現でシンプルにパシッと決める方法を希望しています。
よろしくお願いします。
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>'; });
この回答への補足
「\x3C」とありましたが、「\x3C」でも「<」でも大丈夫でした。
環境を書き忘れていましたが、WinXP IE8 HTAとして実行です。
環境によって「\x3C」でなければならない場合もあるのですかね?
とりあえず、私の環境では大丈夫でしたが、汎用的な環境を想定し
ご回答をいただいたのかと思います。
本当に参考になりました。ありがとうございました。
試したところ期待通りに動きました。
すごいです。こんな書き方が出来るのですね。
私が心の奥で求めていた方法と一致します。
今回は本当に質問してよかったです。
比較的短時間に、複数の方にいろいろな方法を
教えていただけ大変勉強になりました。
ありがとうございました。
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でした)
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中の無名関数に入れても動くはずですが、遅くなります。
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);
一行で書いても構いません。
私の最初のコードで得られる結果よりはるかにいい方法ですね。
ただ、3回の置換は少し冗長に感じます。
ただ、「\0」でいったん退避するという方法はユニークであり
参考になりました。ありがとうございました。
No.3
- 回答日時:
もっとうまい方法があるかも知れませんが…
var str = "hoge_hogehove___asd#bn__";
str = str.replace(/(_+)/g, "<span class='…'>$1</span>").replace(/_/g, "#");
alert(str);
この回答への補足
いけたと思ったのですが、「_」はあくまでも空白であるため1回目の置換でつけたspanタグ内の空白も置換してしまった為、希望の動きにはなりませんでした。
仕方がないので最後に「.replace(/span#class/g, "span class");」を入れ、3発置換にしました。
しかしこれだと最初の文字列の段階で「span#class」という文字列があった場合には意図せぬ置換を行なうことになってしまいます。が、実際にはまずないであろうと思われる文字列なので、とりあえずはいいことにしました。
質問前は「無理かも」と思っていたのですが意外といろいろな案が出てくるので、もしかしたらさらなる良案が出てくるかもしれないので、もう少し様子を見させていただきます。
うわ。これですね。
普通に2段階で置換すればいいだけだったんですね…。
意味合い的にも最も適しているように感じます。
難しく考えすぎていたのかもしれません。
大変参考になりました。ありがとうございました。
※てか、皆さんのご回答が早くてびっくりしています。
今回は本当に、質問してよかったです。
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>
正規表現の指定時に「/」記号を使用するので「途中結果では『/』を含まない文字列を使って、最後の最後で『/』を含む文字列に置換している」と言う事に注意すること(そうしないと正規表現の置換元の文字列の指定がメンド臭い事になる)
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="…">#」を正規表現の置換を使って「#」に置換したらどうなりますか?
冗長になるのが判っているなら、冗長にしたあとで、冗長部分を削除すれば良いでしょう。
そりゃ「一発で冗長部分を作らずに最適な置換をする」と気持ち良いですが「結果が最適化されてりゃ、途中はどうでもいい」と思いませんか?
おお。逆転の発想といいますか、私には無かった発想です。
正規表現での置換を1行追加しただけで実現できました。
「一発」ではありませんが、私が質問で掲げた「シンプルにパシッ」
には十分該当する解決策だと思います。
私が抱えている課題は一旦解決しました。
しかしそれ以上に、行き詰まったときには
少し違った角度からアプローチしたり、考え方を変えてみたりすると
出口が見える(場合もある)という好例を学ばせていただきました。
大変参考になりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript htmlとcssで分数を表示後、分数の右側に文書を書きたい 1 2022/04/28 10:09
- HTML・CSS 分数が正常に表示されない。 6 2022/05/09 18:53
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- HTML・CSS CSSのホバーエフェクト 1 2023/06/19 06:53
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- その他(プログラミング・Web制作) pythonのWebスクレイピングでfind_allだとurlがNoneに 4 2022/04/17 18:21
- PHP ランキングを表示する際の画像の大きさを固定することは可能でしょうか? <?php if ( has_ 1 2022/07/21 14:55
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
- HTML・CSS FC2カートのテンプレートでの商品表示について 1 2023/03/02 18:05
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
Vb.netのグローバル変数の宣言...
-
HTTPSのとき":"が"%3A"ではなく...
-
Linux バイナリ実行できない "...
-
ASP+アクセスでのSQLコメントに...
-
【正規表現】【javascript】CR...
-
サブウインドウから親ウインド...
-
「オブジェクトが必要です。」...
-
hoge の謎
-
JQueryの繰り返し処理が動かな...
-
エクセルでブラウザへのフォー...
-
ifreamをリロードしたい
-
ボタンをクリックすると数が増...
-
Excel VBA の ChangeFileAccess
-
onclick指定関数の引数へローカ...
-
google apps scriptの終了のさせ方
-
idを使わずにonclickで自身の要...
-
JavaScriptで決まった「時刻」...
-
C#テキストボックスの文字を配...
-
JavaScript window.openで開く...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【正規表現】【javascript】CR...
-
Linux バイナリ実行できない "...
-
ASP+アクセスでのSQLコメントに...
-
Boolean型配列中のTrueの有無を...
-
Excel VBA の ChangeFileAccess
-
【Jquery】changeイベント毎にa...
-
Vb.netのグローバル変数の宣言...
-
static constメンバ変数(配列)...
-
同じ型【ハイフンと数字】だけ...
-
class指定したHTML要素の背景色...
-
onclick指定関数の引数へローカ...
-
ボタンをクリックすると数が増...
-
HTTPSのとき":"が"%3A"ではなく...
-
「オブジェクトが必要です。」...
-
MFCのキャプション変更
-
ページ離脱時のalertボタンで処...
-
アンカーリンクをクリックさせ...
-
VC++のちらつき防止方法
-
C# .NET DataGridView の行を追...
-
2次元のJSON形式の配列の展開
おすすめ情報