2010-07-19 2 views
0
내가는 preg_match를 사용하여 DIV 클래스 = "부모"의 모든 내용을 얻을 필요가

,parent div를 preg_match하는 방법은 무엇입니까?

<div class = "parent"> 

    <div id = "child1"> 
    </div> 

    <div id = "child2"> 
    </div> 

</div> 

누구?

+1

regex와 HTML을 구문 분석하려고하는 또 다른 사람 ... [어 - 오] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 # 1732454) ... – quantumSoup

+1

# 1 답변보기 : http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

이것은 실제로 운동입니다. 내 강사가 준거야. 우리는 정규식 atm을 사용하고 있습니다. – Karl

답변

2

정확한 방법은 the DOMxpath을 사용하여 추출하려는 특정 요소와 속성을 타겟팅하는 것입니다. 그러나 이것이 숙제이므로 강사를 교육합시다.

정확한 문자열이 정규식이 작동 감안할 때 : !<div class = "parent">(.+)</div>!s

의 핵심은 "s"수정이다. "."문자를 "개행을 제외한 모든 것"에서 "개행을 포함한 모든 것"으로 바꿉니다.

그러나 공백이 = 주변에서 제거 된 경우이 문제는 해결됩니다. 속성이 더 많으면 깨질 수 있습니다. 더 많은 클래스 이름이 있다면, 이것은 깨질 것입니다. 즉, HTML 을 처리하는 최악의 방법은입니다.

되는 HTML이처럼 보였다 경우 지옥, 그것은 휴식 것이 :

<div> 
    <div class = "parent"> 
     My spoon is too big! 
     <div> 
      I am a banana! 
     </div><!-- Matches when un-greedy --> 
    </div> 
</div><!-- Matches when greedy --> 

이유는 무엇입니까? .+이 "욕심 많은"것입니다. 그것은 다음 절까지 가능한 모든 것을 일치시킵니다. 즉, div.parent에서부터 욕심 많은 댓글에 이르기까지 모든 것을 일치시킵니다. 물음표 (.+?)를 추가하여 탐욕스럽지 않게 만들 수는 있지만 가능한 마지막 첫 번째 절이 아닌 첫 번째 가능한 다음 절과 일치합니다. 즉, div.parent에서부터 욕심 많은 코멘트에 이르기까지 모든 것을 일치시킵니다.

중첩 문제로 인해 정규 표현식은 HTML을 구문 분석하는 데 매우 열악한 도구입니다. 내가 여기에 표시 한 문제는 오직 h̨̜̜̟̬̭͍o - ̻̹̥̻ͧ̆͆̊̉̍r̟͓ͨ͆ͨr̪̖̠̖̤̊̾ͣͦo̡̬͉͈͚̙͙ͯ͑ͨ͒ ͩ̇ȓ̵̥̙͈̟̠̠̏̊̏̊͠͠의 표면을 만지면 나타납니다.

가능한 경우 실제 HTML/XML 구문 분석기를 사용하여 결과 DOM을 사용하십시오. 그것은 당신의 온건함을 구할 것입니다. (링크에서 언급 한 바와 같이)은 문제가없는 것은 비록 당신의 목적을 위해

+0

's'수정자를 설명하기 위해 +1. 요즘은 저에게 몇 번 문제가되어 왔습니다. 어떻게 해결 해야할지 잊어 버렸습니다! –

+0

감사합니다. – Karl

0

이 아마 할 것입니다 : 일치 [0] 부모를 포함하여 일치하는 텍스트를 (포함

preg_match('/<div class = \'parent\'>(.*)<\/div>/s',$input,$matches); 

$, 후 div)이고 $ matches [1]은 내부 항목 만 포함합니다.

+0

고마워요. – Karl

0

는이 같은 야만적 뭔가와 끝까지 : 원하는 클래스의 오프닝 div 태그에서 검색,

/<div[^>]+class ?= ?"parent"[^>]*>(\s*(?:<div.*<\/div>\s*)*)<\/div>/Us 

첫째 - 내가 사용하고자 [^>]하지만 아무것도 지정하는 문자 그룹은 이는 " > "문자. 그런 다음 "="(또는 아님) 주위의 공백을 허용합니다.

그런 다음 기본적인 아이디어는 각 후속 시작 div 태그를 닫는 메이트와 짝을 지어 올바른 지점에서 멈출 수있게하는 것입니다. 이 작업은 0 번 이상 반복 할 수있는 캡처되지 않는 하위 패턴으로 수행됩니다. 하나의 중첩 수준에서만 작동합니다. 이 문제를 해결하려면 재귀가 필요하며 개념화하기가 어렵습니다.내가 (문자열을 통해 도보로 선호하는 각 시간을 시작하는 것 내가 제정신 일을 할 수없는 경우,

/<div[^>]+class ?= ?"parent"[^>]*>(\s*(<div.*(?2).*<\/div>\s*)*)<\/div>/Us 

전체와 DOM을 사용

재귀 버전은 다음과 같이 보일 것입니다 이전 경기) 내가 만난 모든 여는 div 태그에 대해 카운터를 증가시키고 각 닫는 태그에 대해 카운터를 감소시킵니다.

참고 사항이 내용은 필자의 머리 꼭대기에서 벗어나 정규 표현식을 파싱하는 것은 제정신이라고 생각하지 않고 정규 표현식을 위해 게시되었습니다. 또한, 모든 와일드 카드의 균형을 맞추기 위해 정규식 엔진이 수행해야하는 체조의 로그를 보는 것을 싫어합니다.

관련 문제