###実現したいこと
twitterのハッシュタグのように「#xxx」という文字列をタグとして抽出したいです。
#keyword
の入力値を#clone
にコピーする際に、抽出したタグをspan
で囲みたいのですが、その過程で次の3点に行き詰っています。
###発生している問題
➀改行を入れても1つのタグとして取得してしまう。
➁取得できたタグのうち最後のものにしかspan
がつかない。
➂最後の#canが取得できない。
このような問題です。
上の➀がわかりにくいので具体的に言いますと、
「#hello」
↓
「#hell」改行「o」
のように入力すると、
「#hell o」という風にスペースが入って取得されてしまうという問題です。
このとき取得したいのは「#hell」だけなのです。
###該当のソースコード
html
1<textarea type="text" id="keyword" class="box" value="">#hello world #yes we #can</textarea> 2<div id="clone" class="box"></div> 3<button id="btn">clone</button>
css
1.box { 2 border: 1px solid black; 3 padding: 5px; 4 border-radius: 5px; 5 resize: none; 6 height: 100px; 7 width: 200px; 8 white-space: pre-wrap; 9 font-family: unset; 10} 11span {color:blue;} 12
function hash( str ){ var regexp = new RegExp( /#+[^ ]+(\s| )/ ); var result = regexp.test( str ); if ( regexp.test( str ) ) { // 取得 var tags = str.match( /#+[^ ]+(\s| )/g ); console.log( 'tags;', tags ); // タグにspanをつけて全文をコピー tags.forEach(function( value ) { if ( str.match( value ) ) { var target = str.match( value ); console.log( 'target:',target ); var span = '<span class="tag">' + target + '</span>'; var replaced = str.replace( target, span ); $( '#clone' ).html( replaced ); } }); }else{ $( '#clone' ).html( str ); } } $( '#btn' ).click( function(){ hash( $( '#keyword' ).val() ); });
###試したこと
なんとなく➁については原因がわかっていて、ループの中で$( '#clone' ).html( replaced );
を書いているために毎回上書きされてしまい、だから最後にしかspanがつかないのだと思うのですが、ループの外に出してみればコピー自体生じず、解決策がわかりません。
そして➀と➂についてはそもそも処理がわからない状況です。
###ソースコードのサンプル
https://jsfiddle.net/udwzey7v/
ご意見、ご回答、宜しくお願い致します。
###補足
twitterのタグ抽出とほぼ同じなので、詳しい抽出条件は次の通りです。
■基本的には、以下3つを満たしたときにタグ化する
・文字列の先頭が、「#」か「#」のようなシャープであること
・シャープ直前が、半角か全角のスペースであること
・文字列の直後が、半角か全角のスペースであること
■例外として、スペースがなくてもタグ化する
・シャープ直前が、記号、行頭、textarea先頭の場合、シャープ直前のスペースはがなくてもタグ化
・文字列がtextarea末尾の場合、直後のスペースがなくてもタグ化
(ただしtwitterでは記号が除外され、「#tag!」のタグは「#tag」と抽出されますが、今回は「#tag!」で構いません。)
以上の条件の具体例を以下に列挙致しましたので、ご参照ください。
https://jsfiddle.net/04awdpu1/
回答2件
あなたの回答
tips
プレビュー