2014-11-09 3 views
0

HTML로 된 문장을 단어로 분리하고 텍스트 내용이 손상되지 않도록 인라인 HTML 태그를 남기려면 자바 스크립트를 사용하는 방법을 찾고 있습니다. 구두점은 가장 가까운 단어의 일부로 간주 될 수 있습니다. 정규식을 사용하고 싶습니다. 아마 문장을 나누는 데 preg_split()을 사용하고 싶습니다. 나는 다음과 끝내고 싶은, 바람직하게는HTML로 된 문장을 단어로 나눕니다 (인라인 HTML 그대로 유지)

A word, <a href='#' title=''>words within tags should remain intact</a>, so here's 
<b>even more</b> <u>words</u> 

:

[0] => A 
[1] => word, 
[2] => <a href='#' title=''>words within tags should remain intact</a>, 
[3] => so 
[4] => here's 
[5] => <b>even more</b> 
[6] => <u>words</u> 

내가 (내가 Bobince' answer를 읽고 즐길 정규식 HTML을 구문 분석에 대한 논의에 대해 알고 여기에 예를 다음과 같습니다 : -P),하지만 html 태그에 속성을 가하지 않고 문장의 단어를 분할해야합니다. Regex와 다른 방식으로 JS로이 작업을 수행하는 방법을 알지 못합니다. 물론, 대안이 있다면, 비슷한 결과를 얻기 위해 그들을 적응시키는 것보다 더 행복 할 것입니다. :-)


편집 : 내가 이것에 대해 유래에 비슷한 질문을 검색하지만, 이러한 나를 위해 상자를 선택하지 않습니다. 원근감을 조금 더 표현하려면 :

  • splitting-up-html-code-tags-and-content : 대상을 그대로두고 원하는 인라인 HTML을 나눕니다.
  • php-regex-to-match-outside-of-html-tags : HTML 태그 내 에서조차 HTML 스 니펫의 모든 텍스트 노드를 타겟팅합니다. 그러나 실제로는 HTML 요소 외부의 공간 만 대상으로하고 싶습니다 (HTML 태그로 둘러싸인 텍스트 노드 내의 공백 제외).
+0

preg_split은 (는) 자바 스크립트가 아닙니다. Preg_split()은 PHP입니다. 첫 번째 문장에서 Javascript가 필요하다고 말합니다. 너 스스로 뭐하려고 했니? 시행 착오를 올리면 사람들이 도움이 될 것입니다. – vrijdenker

+0

의견 및 사과에 감사드립니다. 나는 아마 여기 언어를 혼동했다. 둘 다 사용하지만, 나는 JS를 여기에서 목표로 삼는다. 나는 정규 표현식을 이해하기 시작했다. 그래서 나는 도움을 원했다. 나는 여기 주위에 다른 질문을했지만, 대부분은 HTML 태그 내부의 단어들을 분리하는 것처럼 보인다. 내 게시물을 내가 찾은 것으로 업데이트 하겠지만 상자를 체크하지는 않습니다. – Jeroen

+0

작은 업데이트 : 현재'childNode','childValue'를 사용하고 있습니다. 이것은 사용하기가 훨씬 쉽고 논리적 인 것처럼 보입니다. 계속! – Jeroen

답변

1

당신은 다음 코드 사용할 수 있습니다 텍스트 노드를 취하고 단어로 분할, 그것은 모든 자식 노드를 반복

function splitIntoWords(div) { 
 
    function removeEmptyStrings(k) { 
 
    return k !== ''; 
 
    } 
 
    var rWordBoundary = /[\s\n\t]+/; // Includes space, newline, tab 
 
    var output = []; 
 
    for (var i = 0; i < div.childNodes.length; ++i) { // Iterate through all nodes 
 
    var node = div.childNodes[i]; 
 
    if (node.nodeType === Node.TEXT_NODE) { // The child is a text node 
 
     var words = node.nodeValue.split(rWordBoundary).filter(removeEmptyStrings); 
 
     if (words.length) { 
 
     output.push.apply(output, words); 
 
     } 
 
    } else if (node.nodeType === Node.COMMENT_NODE) { 
 
     // What to do here? You can do what you want 
 
    } else { 
 
     output.push(node.outerHTML); 
 
    } 
 
    } 
 
    return output; 
 
} 
 

 
window.onload = function() { 
 
    var div = document.querySelector("div"); 
 
    document.querySelector("pre").innerText = 'Output: ' + JSON.stringify(splitIntoWords(div)); 
 
}
<!-- Note you have to surround your html with a div element --> 
 
<div>A word, <a href='#' title=''>words within tags should remain intact</a>, so here's 
 
    <b>even more</b> <u>words</u> 
 
</div> 
 
<pre></pre>

을 (당신은 텍스트 노드부터 안전하게 작업을 수행 할 수 있습니다 자녀를 포함하지 않음).

이것은 대부분의 문제를 처리합니다. 이렇게하면 text<span>Test</span>과 같은 HTML이 위의 대답과 달리 ["text", "<span>Test</span>"]으로 나옵니다.

<span>There are</span>: 4 words의 결과는 ["<span>There are</span>", ":" /* Extra colon */, "4", "words"] (결과는 같지만 확실한 지 확실하지 않음)으로 실패 할 수 있습니다.

중첩 된 요소로 매우 안전하다고 생각합니다.

+0

내가 이전에 쓴 것과는 반대로, 이것은 갈 해답이다. 그러나 이전에 제출 한 답변은 이것을 사용하여 관점으로 설명합니다. 그래서 내가이 답변을 받아 들였습니다. Regex를 사용하는 대안으로 제공하려면 (Nathan이 제안한 것처럼 매우 까다로울 수 있음). 그러나 설명의 열정 때문에 네이선에게 감사 드리고 싶습니다! – Jeroen

1

이것은 가능하지만 순수 정규식 솔루션을 사용하면 몇 가지 단점이 있습니다. 가장 쉬운 방법은 중첩 HTML입니다. 내가 보여주고 자하는 해결책은이 문제를 해결하기 위해 몇 가지 참조를 사용하지만 복잡한 중첩 된 HTML을 얻는다면 이상한 방법으로 실패 할 것입니다.

/(?:<(\w+)[^>]*>(?:[\w+]+(?:(?!<).*?)<\/\1>?)[^\s\w]?|[^\s]+)/g 

Regex Demo

정규식은 일을 얻기 위해 참조하는 음의 표정 비하인드를 다시 사용합니다. 요구 사항에 따라 역 참조를 제거 할 수 있습니다. 역 참조는 중첩 태그 지원에 도움이됩니다.

JSFiddler Example - 예를 들어 콘솔 출력을 확인하십시오.

여기 JS 피들러의 출력의 당신이 당신을 위해 일을 수정해야합니다 사용하는 경우 당신에 따라

[ 
    "A", 
    "word,", 
    "<a href='#' title=''>words within tags should remain intact</a>,", 
    "so", 
    "here's", 
    "<b>even more</b>", 
    "<u>words</u>" 
] 

있어 (I 출력을 조금 포맷). 나는 공간이 아닌 단어를 생각했지만, 당신은 다른 기준을 가질 수 있습니다.

시작 HTML 태그가 단어 끝 부분에 있으면 제대로 가져올 수 없습니다. 즉. test<span>something else</span>.

+1

이 답변은 질문에 대한 답변입니다. Regex는 실제로 HTML 문장을 분리 할 때 사용하기가 어렵다는 것을 발견했습니다. 내 경우에는 중첩 된 HTML이 없지만 지금은'childNodes','childValue'를 살펴 보려고합니다. – Jeroen

+0

HTML에 주석이 있으면 실패합니다. 어쩌면 주석을 완전히 제거해야할까요? – soktinpk

+0

이 답변은 Regex이 작업을 수행 할 수 있음을 증명합니다. 또한이 답변은 Regex가이 목적에 적합하지 않을 수도 있다고 말합니다. 이 대답은 다른 대답을 사용해야하는 이유를 제시합니다. 사람들이이 질문을 찾을 때 다른 대답이 적절한 해결책 일 수 있다고 생각합니다. 대답은 +1입니다. 나는 다른 하나를 해답으로 인정하고 싶다. 죄송합니다,하지만이 점에 대해 Regex를 사용하는 것에 대해 대단히 감사드립니다! :) – Jeroen