2012-11-27 2 views
2

html 태그 사이에 항목을 캡처하기 위해 Ruby 정규 표현식을 작성해야하는 과제를 완료하려고하는데 실제로 막혔습니다. 나는 어디에서나 검색을 해왔지만 지금까지 정규 표현식 만 배웠기 때문에 사용할 수 있다고 생각하지 않는 html 파서 및 기타 프로그램 사용에 대한 조언을 찾을 수 있습니다.html 태그 안에 여러 항목을 캡처하는 정규 표현식

예제 텍스트는 다음과 같습니다

/<span id="animal_display">.*?<[^>]+>(.*?)<\/[^>]+>.*<\/span>/m 

:

<span id="animal_display"> 
    <a href="/b/bird">Bird</a>  
    <a href="/c/cat">Cat</a> 
    <a href="/c/dog">Dog</a> 
</span> 

나는이 정규 표현식을 사용 BirdCatDog

을 포착하기 위해 노력하고있어, 나는 첫 번째 항목을 얻을 수 있어요 이것으로 세 가지를 모두 얻을 수는 있지만, 정규 표현식을 사용할 수 있기를 원하는 목록에는 정규 표현식을 사용할 수 있어야합니다. 세 가지 항목 :

/<span id="animal_display">\s*<[^>]+>\s*(.*?)<\/a>.\s*<[^>]+>\s*(.*?)<\/a>.\s*<[^>]+>\s*(.*?)<\/a>.<\/span>/ 

항목의 불특정 다수에 일할 수있는 더 일반화 된 정규 표현식이 있습니까? 모든 조언을 크게 주시면 감사하겠습니다.

+0

HTML을 구문 분석하기 위해 regexes를 사용하지 마십시오. 당신의 인생은 슬픔이 될 것이며, 이미 당신을 위해 그것을 할 수있는 기존의 도구가 있습니다. –

답변

1

이 완전한 대답 아니지만, 때때로 털이 캡처 정규식이 될 수 다른 방향에서 문제를 태클로 단순화 - split를 사용하여 :

html = '...' 
r  =/<a[^>]*>\s* | <\/a>[^<]+ /mx 
parts = html.split(r) 

parts.each { |p| puts p.inspect } 

# Output 
"<span id=\"animal_display\">    " 
"Bird" 
"" 
"Cat" 
"" 
"Dog" 
"</span>" 
+0

정말 고마워요! 이 점에 대해 충분한 점수를 얻 자마자 나는 이것을 upvote 할 것이다. – SophiaAP

1

편리한 DOM 파서를 사용하면 더 쉽게 사용할 수 있다고 생각합니다.

https://www.ruby-toolbox.com/categories/html_parsing.html

나는 루비 도구 상자 사이트를 체크 아웃 권하고 싶습니다.

Nokogiri가 HTML 파서에 대한 권장 사항이지만 hpricot을 확인해야합니다. 대단히 좋습니다. '핵심'루비는 아니지만 일반적으로 사용되는 보석입니다.

0

이 하나

str.gsub 시도 (/ < /? [^>] *> /, "")

0

실제 생활에서 나는이 구문 분석 Nokogiri을 사용, 그러나 당신은에있는 과정은 당신에게 일을 할 수있는 잘못된 방법을 가르 칠하기로 결정 보인다, 그래서 여기에 결과를 얻는 방법이 있습니다. 첫째

: 다음

x = '<span id="animal_display"> 
     <a href="/b/bird">Bird</a>  
     <a href="/c/cat">Cat</a> 
     <a href="/c/dog">Dog</a> 
    </span>' 

: 파서 ​​사용하지 않고 일치와에 대한 올바른 결과를 반환하는 정규식을 만들 수있는 방법이 있는지

x.scan(/<a.*?>(.*?)<\/a>/).flatten 
=> ["Bird", "Cat", "Dog"] 

을 나는 확실하지 않다 목록 항목의 임의의 수; subexpression calls을 사용하는 것이 가능할 수도 있지만 매우 복잡합니다.

+0

정말 고마워요! 이 점에 대해 충분한 점수를 얻 자마자 나는 이것을 upvote 할 것이다. – SophiaAP