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

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

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

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

Q&A

解決済

1回答

338閲覧

JavaScriptで正規表現置換を使ってタグ<a>を消したい

tiqua_nibio

総合スコア62

jQuery

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

0グッド

0クリップ

投稿2019/07/26 14:53

下記のコードがあります。

これをjQueryによって、<a>のない形にしたいのです。

html

1 2<table id="preview"> 3 <tr> 4 <td style="text-align: left" class="_con"> 5 <div class="nested"> 6 <span>インダス文明誕生インダス文明誕生インダス文明誕生</span> 7 <a href="https://ja.wikipedia.org/wiki/"><span>インダス文明誕生インダス文明誕生</span></a> 8 <span>インダス文明誕生</span> 9 </div> 10 </td> 11 </tr> 12</table> 13 14

具体的には、

javascript

1 2var str = '<a href="https://ja.wikipedia.org/wiki/"><span>インダス文明誕生インダス文明誕生</span></a>'; 3 4... 5 6var str2 = '<span>インダス文明誕生インダス文明誕生</span>'; 7 8

ということを正規表現置換でやりたいのです。strをstr2に変えたいのです。

実は、unwrapやpropなども試したのですが、うまく動かないので、正規表現置換にたどり着きました。
教えていただけますと幸いです。

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

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

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

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

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

yasutomi

2019/07/26 14:59

正規表現置換にたどり着いたのに 正規表現の勉強をせずにコードだけ回答者に要求するのは teratailで推奨されていない丸投げ行為です。
miyabi_takatsuk

2019/07/26 15:01

うまくいかなかった、って理由で、要素を外すだけのことを正規表現ではやるべきではないと思いますよ・・・。 (役割の違い、そして、正規表現でやるほうがよっぽど難しく、めんどくさくなる) うまくいかなかった、unrap、propなどを使ったJSコードを記載ください。 そこから、改修していくほうが、いいかと思います。
tiqua_nibio

2019/07/27 00:56

正規表現の知識はありますよ。 テキストファイルを編集するようなマクロも組み立てたことはあります。 ですが、javascriptだから、また異なるマナーで書かなければならないので、どうすればいいかを聞いただけです。
guest

回答1

0

ベストアンサー

こんにちは

この回答では、 <a>を除去 および、<a>で囲む という2つのボタンを置いて、

  • <a>を除去 ボタンがクリックされると、 span が a で囲まれていれば、その a を除去する。
  • <a>で囲む ボタンがクリックされると、 span が a で囲まれていなければ、それを a で囲む。

という処理を行うコードを回答します。
対象となるHTMLは以下です。ご質問に挙げられているHTMLに、ボタンを2つ追加しています。

html

1<table id="preview"> 2 <tr> 3 <td style="text-align: left" class="_con"> 4 <div class="nested"> 5 <span>インダス文明誕生インダス文明誕生インダス文明誕生</span> 6 <a href="https://ja.wikipedia.org/wiki/"><span>インダス文明誕生インダス文明誕生</span></a> 7 <span>インダス文明誕生</span> 8 </div> 9 </td> 10 </tr> 11</table> 12 13<button id="unwrap_btn">&lt;a&gt;を除去</button> 14 15<button id="wrap_btn">&lt;a&gt;で囲む</button>

以下は、上記を実現するために正規表現を使ってみたコード例です。

javascript

1$(function() { 2 3 // span が a で囲まれていれば、その a を除去する。 4 $('#unwrap_btn').click(function() { 5 const htmlAfter = 6 $('div.nested') 7 .html() 8 .split('\n') 9 .map(line => /<a\s+[^>]+>(.+)</a>/.exec(line) ? RegExp.$1 : line) 10 .join('\n'); 11 $('div.nested').html(htmlAfter); 12 }); 13 14 // span が a で囲まれていなければ、それを a で囲む。 15 $('#wrap_btn').click(function() { 16 const htmlAfter = 17 $('div.nested') 18 .html() 19 .split('\n') 20 .map(line => 21 /^\s*(<span>[^<]+</span>)/.exec(line) ? 22 `<a href="https://ja.wikipedia.org/wiki/">${RegExp.$1}</a>` : line) 23 .join('\n'); 24 $('div.nested').html(htmlAfter); 25 }); 26 27}); 28

ちなみにJQuery の .wrap() , .unwrap() を使うとより短いコードで実現できます。

javascript

1$(function() { 2 3 // span が a で囲まれていれば、その a を除去する。 4 $('#unwrap_btn').click(function() { 5 $('a > span').unwrap(); 6 }); 7 8 // span が a で囲まれていなければ、それを a で囲む。 9 $('#wrap_btn').click(function() { 10 $('div.nested > span').wrap('<a href="https://ja.wikipedia.org/wiki/"></a>'); 11 }); 12 13});

追記

ご質問にあった、

strをstr2に変えたいのです。

に回答しますと、 HTMLの文字列 str が与えられたときに、 str の中に、hrefなどの属性を1つ以上持つような a タグが含まれる場合、その a タグで囲まれた内容を返し、そのような a タグがない場合は何もせず str をそのまま返す関数は、以下のように書けます。

javascript

1const unwrapOuterLink = str => /<a\s+[^>]+>(.+)</a>/.exec(str) ? RegExp.$1 : str;

先に書いた回答でも、上記の三項演算子を使って、なるべくコードを短くなるようにしています。

または、 RegExp.$1 は非推奨 になっているので、使用を避けるとすれば以下です。

javascript

1const unwrapOuterLink = str => { 2 const m = /<a\s+[^>]+>(.+)</a>/.exec(str); 3 return m ? m[1] : str; 4}

なお、上記の正規表現だと、 aタグの開始が、 属性のない <a> である場合には対応できません。また、 str の中に、該当する aタグが複数あっても、aを除去するのは先頭のものだけです。これらに対応するには、正規表現を見直さなければなりませんが、まずはご質問に明示的に記載された最低限の要件を満たすものを回答しました。

以上、参考になれば幸いです。

投稿2019/07/26 21:03

編集2019/07/27 04:31
jun68ykt

総合スコア9058

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

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

tiqua_nibio

2019/07/27 01:01

ありがとうございます。 私は(javascriptではありませんが)正規表現を用いたマクロを組み立てる仕事はしておりましたが、jun68yktさんは、やはり先生ですね。 1つのことを学ぼうとしていたら、3から5つのことを教えていただけ、大変感謝しております。 やはり上級者に教えていただくと、色々と学べます。
jun68ykt

2019/07/27 02:04

どういたしまして。そのように仰って頂けますと、回答者冥利に尽きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問