2010-12-27 4 views
0

スクリプトタグ、プレーンテキストなどのHTML文字列があるとします。HTMLの文字列を指定すると、アンカーのHTMLタグのみを取り除く最も良い方法は何ですか?

<a>タグのみを削除するにはどうすればよいですか?

ここではいくつかの方法を使用していますが、これらはすべてのタグ用です。 Strip HTML from Text JavaScript

+0

あなたがタグの内容を保存しますか? – SLaks

答えて

3

var content = $('<div>' + htmlString + '</div>'); 
content.find('a').replaceWith(function() { return this.childNodes; }); 
var newHtml = content.html(); 

を包む<div>タグを追加するには、私たちが戻って必要なHTMLを取得することができます。

私のブログにmore detailed explanationと書いてあります。

+0

これにより、エレメントのいずれかにアタッチされたイベントハンドラーを破るなどの予期しない副作用が発生することがあります。 – eyelidlessness

+0

@eyelidlessness:彼は_string_を持っています。イベントハンドラはありません。彼は文字列を持っていなかった、固定されていた。 – SLaks

+0

@SLaks、それを指摘してくれてありがとう、私はそれを逃した。誰かがDOM構造内で同じことを達成しようとしている場合のために、私は別の答えで別のアプローチを提供しました。 – eyelidlessness

0

は< >タグはそれほど単純ではungreedy regexpはトリックを行うだろう、他の< >タグを保持する(すなわちstring.match(/<a>(.*?)<\/a>/)を、この例では、タグは何の属性を持っていないと仮定)想定されていません。 jQueryのを使用して

3

このアプローチでは、既存のDOMノードが保持され、イベントがアタッチされているアンカー内に要素がある場合、副作用が最小限に抑えられます。

(jQueryを使って)を使用する
function unwrapAnchors() { 
    if(!('tagName' in this) || this.tagName.toLowerCase() != 'a' || !('parentNode' in this)) { 
     return; 
    } 
    var childNodes = this.childNodes || [], children = [], child; 
    // Convert childNodes collection to array 
    for(var i = 0, childNodes = this.childNodes || []; i < childNodes.length; i++) { 
     children[i] = childNodes[i]; 
    } 
    // Move children outside element 
    for(i = 0; i < children.length; i++) { 
     child = children[i]; 
     if(('tagName' in child) && child.tagName.toLowerCase() == 'a') { 
      child.parentNode.removeChild(child); 
     } else { 
      this.parentNode.insertBefore(child, this); 
     } 
    } 
    // Remove now-empty anchor 
    this.parentNode.removeChild(this); 
} 

$('a').each(unwrapAnchors); 

(jQueryのなし)を使用するには、次のパフォーマンスが懸念される場合

var a = document.getElementsByTagName('a'); 
while(a.length) { 
    unwrapAnchors.call(a[a.length - 1]); 
} 
+0

'var elem = arguments [0] ||この ' – SLaks

+1

@SLaksは、jQueryで使用され、' el'がイテレータになります。 – eyelidlessness

0

はここでネイティブ(非ライブラリー)ソリューションです。

function stripTag(str, tag) { 
    var a, parent, div = document.createElement('div'); 
    div.innerHTML = str; 
    a = div.getElementsByTagName(tag); 
    while(a[0]) { 
     parent = a[0].parentNode; 
     while (a[0].firstChild) { 
      parent.insertBefore(a[0].firstChild, a[0]); 
     } 
     parent.removeChild(a[0]); 
    } 
    return div.innerHTML; 
} 

はこのようにそれを使用します。

alert(stripTag(my_string, 'a')); 
関連する問題