質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

692閲覧

テキストエリア内の入力文字を別の場所に出力する際、内部リンクと外部リンクを区別し、同時に表示させたい

barao

総合スコア18

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2018/07/05 07:23

編集2018/07/06 01:17

前提・実現したいこと

テキストエリアに記述した文字を別のブロックに表示させるシステムを制作中です。
テキストの内容は正規表現などを利用し変換しています。
リンクの処理に困っており、下記それぞれ詰んでいます。お助けください。

発生している問題・エラーメッセージ

- 内部リンクと外部リンクが同じテキストエリアに共存できない - 現状「内部リンク」「外部リンク」など決まったテキストしか表示させられず、企業名やページリンクなど柔軟な入力ができない。

イメージ説明

該当のソースコード

HTML

1 <div id="txtinput" class=""> 2 <textarea name="txt" rows="6">外部リンクあああhttp://uxmilk.jp/ああああ内部リンク/www.pandanoir.info/entry/2012/09/06/224541いいいい</textarea> 3 </div> 4 <div id="datailBox"> 5 <div class="mainTxt__area"></div> 6 </div>

jQuery

1 //テキストエリアの処理 2 $('#txtinput').on('keyup', 'textarea', function() { 3 let elements_blocks_txtarea = $(document).find('#txtinput').find('textarea'); 4 let elements_blocks_maintxtArea = $(document).find('#datailBox').find('.mainTxt__area'); 5 let cul = Number($(document).find('#txtinput').find('textarea').index(this)); 6 let txtarea_txt = $(this).val(); 7 let p = '</p><p class="mainTxt">'; 8 let outerSerch,outerLink,innerLink,innerSerch; 9 10 //外部リンク内部リンクを振り分け 11 if(txtarea_txt.match(/http/)){ 12 console.log('a:'); 13 outerSerch= "((https?|ftp)(://[-_.!~*\'()a-zA-Z0-9;/?:\@&=+$,%#]+))"; 14 outerLink = new RegExp(outerSerch, "g"); 15 outerLinkTarget = "<a href='$1' target='_blank'>"+'外部リンク'+"</a><span class='newWin'><img src='/resource/images/detail/2015new_icon_use_01.png' alt='newwindow' width='9' height='10'></span>"; 16 txtarea_txt = txtarea_txt.replace(outerLink,outerLinkTarget); 17 }else if(txtarea_txt.match(///)){ 18 console.log('b:'); 19 innerSerch = "(/[-_.!~*\'()a-zA-Z0-9;/?:\@&=+$,%#]+)"; 20 innerLink = new RegExp(innerSerch,'g'); 21 innerLinkTarget = "<a href='$1' class=''>"+'内部リンク'+"</a>"; 22 txtarea_txt = txtarea_txt.replace(innerLink,innerLinkTarget); 23 } 24 txtarea_txt = `<p class="mainTxt">` + txtarea_txt; 25 txtarea_txt = txtarea_txt.replace(/\r\n/g, "<br>"); 26 txtarea_txt = txtarea_txt.replace(/(\n|\r)/g, "<br>"); 27 txtarea_txt = txtarea_txt.replace(/(<br>){2,}/g, "\n" + p + "\n"); 28 txtarea_txt = txtarea_txt.replace(/<br>/g, "<br>\n"); 29 txtarea_txt = txtarea_txt.replace(/<p class="mainTxt">(\r\n|\n|\r}\b)*</p>/g, ""); 30 txtarea_txt = txtarea_txt.replace(/<p class="mainTxt">(\r\n|\n|\r}\b)*<br>/g, ""); 31 txtarea_txt = txtarea_txt.replace(/<p class="mainTxt">(\n)</p>/g, ""); 32 txtarea_txt = txtarea_txt.replace(/\「\「/g, '<strong>'); 33 txtarea_txt = txtarea_txt.replace(/\」\」/g, '</strong>'); 34 txtarea_txt = txtarea_txt.replace(/\<\</g, '<small class="small__txt">'); 35 txtarea_txt = txtarea_txt.replace(/\>\>/g, '</small>'); 36 txtarea_txt = txtarea_txt.replace(/\{\{/g, '<strong class="txtRed">'); 37 txtarea_txt = txtarea_txt.replace(/\}\}/g, '</strong>'); 38 txtarea_txt += "</p>"; 39 elements_blocks_maintxtArea = elements_blocks_maintxtArea.eq(cul); 40 elements_blocks_maintxtArea.html(txtarea_txt); 41 });

試したこと

正規表現の見直し
外部リンク、内部リンクを別の場所で代入

補足情報(FW/ツールのバージョンなど)

jquery3.3.1使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/07/05 07:25

どのような文章があってどのような結果となるのでしょうか。例示してください。
m.ts10806

2018/07/05 07:26

もし、リンクに任意の名称を入れたいようでしたらteratailのマークダウンのように別途ルールを設ける必要があります。teratailの場合→ [リンク文言](URL)
barao

2018/07/05 07:42

説明画像を追加したのですがこちらからは見えていません。他の方には見えているのでしょうか?
m.ts10806

2018/07/05 07:44

コードブロック```内はマークダウン機能が効きません。外に出してください。想定通りできているかどうかは編集画面右側のプレビューを見ながら調整してください。
m.ts10806

2018/07/05 07:45

画像よりも実際のテキストデータを提示されて方が良いように思います。(画像ですとコピペで確認できません)
barao

2018/07/05 07:51

ご指摘ありがとうございます。テキストを追加しました。
m.ts10806

2018/07/05 08:06

あれ?だいぶコード変わりましたね。
barao

2018/07/05 08:24

ルール制定の部分がネックなので色々不備があり、申し訳ありません。18時以降は返答が難しいため明日以降の対応になりますことご了承ください。
m.ts10806

2018/07/05 08:30

いえ、不備とは思っていません。何とか素の状態で頑張ろうとするのは素晴しいとは思いますが、決まったテキストではなく任意のもの、しかも外部リンクと内部リンクを織り交ぜるとなるとルール設定をするしかないなと思った次第です。「必ずここにリンクがあって、必ずここにリンクテキストがある」という状態を作らないといけませんし「外部リンクである」「内部リンクである」もわけたほうが確実です。ルールについては自身で決めてしまえば良いかとは思いますし、自由だと思います。毎回打たせるのが面倒であればteratailのマークダウンのようにボタンを押したらそのタグが出るようにしてあげると良いですし。
barao

2018/07/05 08:44

ありがとうございます。勉強になります。
m.ts10806

2018/07/05 08:46

質問への追記・修正の依頼で長々と、しかもあまり回答になっていなくてすみません。※私の場合はルール作ってやってます。JavaScriptではなくkeyup時点でAjaxでPHPに渡して結果受け取るやり方ですが
guest

回答1

0

ベストアンサー

replace() は第二引数として関数も使えます。

JavaScript

1txtarea_txt = txtarea_txt.replace(/[%!#$&'()*+,/:;=?@[]0-9A-Za-z._~-]+/g, function(match, offset, string) { 2 if (match.startsWith('http')) { 3 // 外部リンク置換処理。 4 } else { 5 // 内部リンク置換処理。 6 } 7});

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_function_as_a_parameter

投稿2018/07/05 09:03

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

barao

2018/07/06 00:36 編集

返信が遅くなりまして申し訳ありません。 下記のように置換処理を加えてテストしてみましたが、やはり同居はできないようです。 何か処理記述が間違っていますでしょうか? txtarea_txt = txtarea_txt.replace(/[%!#$&'()*+,/:;=?@[]0-9A-Za-z._~-]+/g, function(match, offset, string) { if (match.startsWith('http')) { outerSerch= "((https?|ftp)(://[-_.!~*\'()a-zA-Z0-9;/?:\@&=+$,%#]+))"; outerLink = new RegExp(outerSerch, "g"); outerLinkTarget = "<a href='$1' target='_blank'>"+'外部リンク'+"</a><span class='newWin'><img src='/resource/images/detail/2015new_icon_use_01.png' alt='newwindow' width='9' height='10'></span>"; txtarea_txt = txtarea_txt.replace(outerLink,outerLinkTarget); return txtarea_txt; } else { innerSerch = "(/[-_.!~*\'()a-zA-Z0-9;/?:\@&=+$,%#]+)"; innerLink = new RegExp(innerSerch,'g'); innerLinkTarget = "<a href='$1' class=''>"+'内部リンク'+"</a>"; txtarea_txt = txtarea_txt.replace(innerLink,innerLinkTarget); return txtarea_txt; } });
x_x

2018/07/11 02:33

リンクも提示しているので読んでください。 matchがマッチした文字列なのでこれを変換して返します。 とくにここで変数 txtarea_txt を書き換えてしまっては意味がなくなってしまいます。
barao

2018/07/11 07:59

ご回答ありがとうございます。 3番目の引数に何を返すかが問題だったという事ですね(^o^) 一つずつ変数を返してみると上手くいくものがありました。 大変勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問