2011-11-15 44 views
0

好吧,我有以下字符串刪除嵌套<SPAN>沒有ID

我有一個包含以下內容的字符串:

<span>A</span>BC<span id="blabla">D<span>EF</span></span>GH 

我希望能夠使用純JavaScript來剔除任何span標記在沒有一個id,使輸出的樣子:

ABC<span id="blabla">DEF</span>GH 

我有下面的代碼工作正常,但中間不處理嵌套的跨度(即HOL的一個ds EF)。我只需要知道如何使用遞歸來實現我的目標。

function removeSpans2(s) { 
    var a = document.createElement('div'); 
    a.innerHTML = s; 
    var node, next = a.firstChild; 

    while (node = next) { 
    next = next.nextSibling 

    if (node.tagName && node.tagName.toLowerCase() == 'span' && !node.id) { 
     a.replaceChild(document.createTextNode(node.textContent || node.innerText), node); 
    } 
    } 
    return a.innerHTML; 
} 

回答

1

內容不需要遞歸,找出了一個更簡單的算法。這個可以處理各種嵌套元素,你可以在span中有A元素,或者跨越As,或跨越跨度跨越......任何。

function removeSpans3(s) { 
    var a = document.createElement('div'); 
    a.innerHTML = s; 
    var span, spans = a.getElementsByTagName('span'); 
    var frag, arr = []; 

    // Stabilise spans collection in array 
    for (var i=0, iLen=spans.length; i<iLen; i++) { 
    arr[i] = spans[i]; 
    } 

    // Process spans 
    for (i=0; i<iLen; i++) { 
    span = arr[i]; 

    // If no id, put content into a fragment 
    if (!span.id) { 

     // Some older IEs may not like createDocumentFragment 
     frag = document.createDocumentFragment(); 

     while (span.firstChild) { 
     frag.appendChild(span.firstChild); 
     } 

     // Replace span with its content in the fragment 
     span.parentNode.replaceChild(frag, span); 
    } 
    } 
    return a.innerHTML; 
} 
+0

我真的很感謝你的努力。你真的救了我的一天。非常感謝 –

1

完美的時候拉了一些遞歸:

function removeSpans2(s) { 
    var a = document.createElement('div'); 
    a.innerHTML = s; 
    var node, next = a.firstChild; 

    while (node = next) { 
    next = next.nextSibling 

    if (node.tagName && node.tagName.toLowerCase() == 'span' && !node.id) { 
     a.replaceChild(document.createTextNode(removeSpans2(node.textContent || node.innerText)), node); 
    } else if (node.innerText != undefined){ 
     var node2 = node.cloneNode(true); 
     node2.innerText = removeSpans2(node2.innerText); 
     a.replaceChild(node2, node); 
    } 
    } 
    return a.innerHTML; 
} 
+1

您是指第14行的a.replaceChild(node2,node)? – Strelok

+0

是的,我做到了。謝謝! – Godwin

1

我認爲這會工作,只需添加一個遞歸

function removeSpans2(s , el) { 
    var a = el || document.createElement('div'); 
    a.innerHTML = s; 

    var node, next = a.firstChild; 

    while (node = next) { 
     next = next.nextSibling; 
     if(node.children && node.children.length) { 
      arguments.callee(node.innerHTML , node); 
     }else if (node.tagName && node.tagName.toLowerCase() == 'span' && !node.id) { 
      a.replaceChild(document.createTextNode(node.textContent || node.innerText), node); 
     } 
    } 
    return a.innerHTML; 
} 
1

你爲什麼不只是簡單地使用與string.replace ()如果它是一個像你似乎表明的HTML字符串。

str.replace(/<span>([A-Za-z0-9]*)<\/span>/g, '$1'); 

你可以調整括號中的數值,以適應什麼樣的內容,你將你的跨度之間找到

編輯上面的代碼編輯只刪除標籤,而不是內部

+0

OP只希望從標記中刪除標記,而不是其內容。 – RobG

+0

好,所以乾脆這樣str.replace(/ ([A-Za-z0-9] *)<\/span>/g,'$ 1'); – anson

+0

簡單,乾淨,但切肉刀。我喜歡完成工作的簡單和容易。 –