2013-07-04 4 views
1

텍스트/내용이있는 마지막 태그 위 및 뒤에 빈 공백을 잘라야합니다. 클라이언트에 표시되는 내용을 제어하고 비주얼을 "중단"하지 않으려합니다.HTML에서 빈 태그의 머리와 꼬리는 어떻게 트리밍합니까?

<p> <br> </p> ~> remove 
<p> <br> </p> ~> remove 
<p> Text <p> 
<p> <br> </p> ~> should preserve only this of the empty tags 
<p> Text </p> 
<p> Text </p> 
<p> <br> </p> ~> remove 
<p> <br> </p> ~> remove 
<p> <br> </p> ~> remove 

나는 Sanitize를 사용하고 있는데 그것은 transfomer 전달되는 기능을 가지고 있습니다. 문서에 example snippet이 있으면 모든 빈 요소가 제거됩니다. 나는 반복한다, 꼬리 빈 요소를 제거하기 위해 지금

should_remove_empty = true 
lambda {|env| 
    node = env[:node] 
    return unless node.elem? 

    unless node.children.any?{|c| c.text? && c.content.strip.length > 0 || !c.text? } 
    node.unlink if should_remove_empty 
    else 
    should_remove_empty = false 
    end 
} 

하지만, :

내가이 빈 태그를 제거 멈출 때 제어 변수를 할당 할 수 있다고 생각, 정규 요소 앞에 빈 요소를 제거하려면 거꾸로. 그러나 살균제는 나에게이 능력을주지 않는다.

누구든지이 작업을 수행하는 방법을 알고 있거나 이미 구현 한 사람이 있습니까?

+0

변환 전후에이 HTML을 어떻게 표시해야할까요? –

+0

첫 번째 코드 예입니다. 모든 "~ 제거"는 변환 후에 제거되어야합니다. – Luccas

+3

[Nokogiri] (http://nokogiri.org)에서이 작업을 수행하는 것이 좋습니다. Sanitize는 필요한 논리를 실제로 처리하지 않습니다. BTW, Sanitize는 Nokogiri를 내부적으로 사용합니다. 올바르게 기억한다면 Nokogiri의 힘을 알 수 있습니다. –

답변

1

나는 README에서 https://github.com/rgrove/sanitize

을 사용하고 있습니다 :

살균은 화이트리스트 기반의 HTML 소독제이다. 수용 가능한 요소와 속성이 인 경우 Sanitize는 문자열에서 허용되지 않는 HTML 인 을 모두 제거합니다.

때로는 허용 할 수없는 요소를 유지하기를 원하므로 사용자에게 적합하지 않습니다.

require 'nokogiri' 

doc = Nokogiri::HTML(<<END_OF_HTML) 
<body> 
<p> <br> </p> 
<p> <br> </p> 
<p> Text </p> 
<p> <br> </p> 
<p> Text </p> 
<p> Text </p> 
<p> <br> </p> 
<p> <br> </p> 
<p> <br> </p> 
</body> 
END_OF_HTML 

ps = doc.xpath '/html/body/p' 

first_text = -1 
last_text = 0 

ps.each_with_index do |p, i| 
    if not p.at_xpath('child::text()').text.strip.empty? #then found some text 
    first_text = i if first_text == -1 
    last_text = i 
    end 
end 

puts ps.slice(first_text .. last_text) 

--output:-- 
<p> Text </p> 
<p> <br></p> 
<p> Text </p> 
<p> Text </p> 
+0

감사합니다 !! 아주 좋은 해결책. nokogiri로 노드 셋을 두 번 반복했지만 솔루션이 더 효율적으로 보입니다. – Luccas