やりたいこと
HTML全体から、特定の文字列を部分検索して別のHTMLに置き換えたいです。
- 一つのドキュメントに複数の文字列がヒットする場合、全て置換。
- 特定のタグ(<p>や<div>)に依存した縛りはなし。置換対象を親にもつHTMLタグは特定できません。
やっていること
以下、サンプルコードです。
HTML
1<html> 2 <body> 3 <div> 4 <p>この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。</p> 5 <p>サンプルはこちら<sup>®</sup></p> 6 </div> 7 <ul> 8 <li>サンプルはこちら</li> 9 <li>吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。</li> 10 <li>吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。</li> 11 <li>かしその当時は何という考もなかったから別段恐しいとも思わなかった。<b>サンプルはこちら</b></li> 12 </ul> 13 </body> 14</html>
「サンプルはこちら」という文章を、Aタグで囲んでリンク設定したいと思います。
途中までですが、containsメソッドを使って以下のJSを書いています。
javascript
1jQuery(function($){ 2 replaceInit(); 3 4 function replaceInit(){ 5 getText() 6 }; 7 8 function getText(){ 9 var targetStr = 'サンプルはこちら'; 10 var targetElmArray = $(":contains('" + targetStr + "')"); 11 12 $(targetElmArray).each(function(index) { 13 console.log($(targetElmArray[index]).text()); 14 }); 15 } 16});
JS処理完了後は以下のようなHTMLを想定しています。
html
1 2<html> 3 <body> 4 <div> 5 <p>この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。</p> 6 <p><a href="#">サンプルはこちら</a><sup>®</sup></p> 7 </div> 8 <ul> 9 <li><a href="#">サンプルはこちら</a></li> 10 <li>吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。</li> 11 <li>吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。</li> 12 <li>かしその当時は何という考もなかったから別段恐しいとも思わなかった。<b><a href="#">サンプルはこちら</a></b></li> 13 </ul> 14 </body> 15</html>
わからないこと
containsメソッドを使った場合、html要素やbody要素が選択される仕様のようです。
0. containsメソッドで「サンプルはこちら」という文章を持つ直近の親要素を洗い出す
- 「サンプルはこちら」という文章を持つ直近の親要素を一つ選択する
- 選択した親要素の中にある「サンプルはこちら」を<a href="#">サンプルはこちら</a>に置き換える
- 2と3をヒット数分繰り返す
というロジックを考えていたのですが、早くも1で詰まってしまっています。
containsメソッドにこだわる必要はないので、ほかにいい手や「containsメソッドでこうやれば直近の親だけ洗い出せる」というやり方があれば教えてください。
よろしくお願いいたします。