2011-11-15 7 views
0

나는 다음을 포함하는 문자열이 없습니다 이드가 없다. 그 결과는 다음과 같을 것입니다스트립 원하지 않는 태그 (더 JQuery와)

ABC<span id="blabla">D</span>EF 

저는 정말 jQuery 사용에 관심이 없습니다. 순수 자바 스크립트를 사용하여 문제를 해결하고 싶습니다. 다음과 같은 문제가 있지만 올바르게 작동하지 않는 것 같습니다.

myText.replace(/(<([^>]+)>)/ig,""); 

도움이 필요하십니까?

+2

당신이이 범위 밖에서의 확신 : [구문 분석하지 마십시오 (X) HTML 정규식 (http://stackoverflow.com/questions/ 1732348/regex-match-open-tags-except-xhtml-self-contained-tags # answer-1732454)? – fncomp

+1

당신이 원하는 것이 있으며 어떤 것이 효과가 있습니다. 당신은 ** 정말로 ** 원하는가? 강력한 솔루션은 정규 표현식이 할 수없는 방식으로 문자열을 구문 분석해야합니다. – RobG

+0

강력한 솔루션을 사용해도 괜찮습니다. 방금 정규식이 갈 길이라고 생각했습니다. –

답변

1

뭔가 일을 할 것입니다하지만 정규 표현식을 사용하지 않습니다 (하지만이 중 하나 jQuery를 사용하지 않습니다 그래서 2 명중 1 명은 나쁘지 않습니다.)

var s = '<span>A</span>BC<span id="blabla">D</span>EF'; 

function removeSpans(s) { 
    var a = document.createElement('div'); 
    var b = a.cloneNode(true); 
    a.innerHTML = s; 
    var node; 
    while (a.firstChild) { 
    node = a.removeChild(a.firstChild); 
    if (node.tagName && 
     node.tagName.toLowerCase() == 'span' && 
     node.id == '') { 
     b.appendChild(document.createTextNode(getText(node))); 
    } else { 
     b.appendChild(node); 
    } 
    } 
    return b.innerHTML; 
} 

alert(removeSpans(s)); 

그것은 특히 강력한 없습니다 (사실은 내가 생각했던 것보다 더 잘 작동) 그리고 가능성이 테스트 케이스에 약간 다른 경우에 실패합니다. 그러나 그것은 전략을 보여줍니다. 여기

, 그래도 꽤 비슷한 다른 버전의 :

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; 
} 
+0

이것은 올바른 대답입니다. 감사! –

+0

스팬이 ID가있는 다른 스팬 안에있을 때 실패하는 이유가 있습니까? –

+0

예, 필수 사항은 아니 었습니다. :-) 답에주의하십시오. OP가 중첩 된 요소를 탐구하고 싶다면 하위 노드로 재귀를 구현하는 것이 그리 어렵지 않습니다. – RobG

3

정규 표현식이 아닌 DOM을 사용하십시오.

var input = '<span>A</span>BC<span id="blabla">D</span>EF', 
    output, 
    tempElt = document.createElement('span'); 

tempElt.innerHTML = input; 

// http://www.quirksmode.org/dom/w3c_html.html#t03 
if (tempElt.innerText) output = tempElt.innerText; 
else output = tempElt.textContent; 

console.log(output); // "ABCDEF" 

데모 : http://jsfiddle.net/mattball/Ctrkf/


이 같은 "It is tempting, if the only tool you have is a hammer, to treat everything as if it were a nail."

+0

분명히이 코드는 _all_ span을 제거합니다. ID를 사용하여 범위를 벗어나는 방법을 이해하는 것은 간단해야하지만이 방법이 유용하다는 것을 잘 모릅니다. –

+0

이렇게하면 보관하려는 항목을 포함하여 모든 기간이 제거됩니다. ID가있는 것만 유지하도록 수정하는 방법이 있습니까? –

+0

내 의견이 보이지 않습니까? 어쨌든, jQuery와 같은 JS 라이브러리를 사용하지 않을 특별한 이유가 있습니까? 그것은 단지 당신의 일을 더 쉽게 할 것입니다. –