2010-07-18 4 views
0

얘들 아, 나는이 페이지에있는 "주소"와 일치하는 것을 시도하고있다 -RegEx가 미리보기와 함께 작동하지 않습니다!

http://www.bbb.org/norfolk/business-reviews/tax-return-preparation/liberty-tax-service-in-virginia-beach-va-48000604

주소 부분의 소스하는

<tr> 
    <td align="right" class="generalinfo_left">Address:</td> 
    <td class="generalinfo_right">1 S Main St Ste 1430<br /></td> 
</tr> 
<tr> 
    <td align="right" class="generalinfo_left"></td> 
    <td class="generalinfo_right">Dayton, OH 45402</td> 
</tr> 

그래서이 HTML을 가지고, 나는 PHP에서 다음 정규식을 시도 .

"%Address:</td>(.*?)(?!<br />)</td>%s" 

여기서 "s"는 "."에 대한 수정 기호입니다. 새 줄도 매치 할 수 있습니다. 하지만 작동하지 않습니다. It doesnt는 "Dayton, OH 45402"부분과 일치합니다. 아무도 그 이유를 말할 수 있습니까?

답변

0

그것은 꽤 정상 :.. 당신이 당신의 샘플을 보면 텍스트, 당신은 특별히 <br />이 발견되면 일치하지해야한다고 주소 및 데이턴 사이, 45,402 OH, 당신이 <br />. (?!<br />)있는 것을 볼 수 있습니다.

당신은 HTML에 대한 파서를 사용합니다.

말한 그 모든 가정 당신의 파일은 전자 xactly이 샘플처럼,이 못생긴 정규식 작동합니다 :

%(Address:)(.*?generalinfo_right">)(.*?)((<br />)|(</td>))(.*?generalinfo_right">)(.*?)((<br />)|(</td>))%s 

그룹 1, 3 및 8 주소가 들어 있습니다.

그러나 대부분 문서가 정확하게 그런 것은 아니기 때문에 HTML을 적절한 구문 분석기로 구문 분석하는 것이 훨씬 더 좋은 해결책 일 것입니다.

+0

고마워요! 그리고 필자는 HTML을 파싱하기 위해 파서를 시험해 볼 것입니다. – Shubham

+1

이 끔찍한 괄호 학대로 인해 하향 추방하는 것은 매우 유혹적입니다. 당신의 표현은 당신이 사용하고있는 * 11 개의 캡쳐가 아닌 2 개의 캡쳐만으로 4 개의 그룹이 필요합니다! –

+0

@Peter : LOL. 진정해, 그 괄호는 판매 중이었고 비용은 많이 들지 않았습니다. 앞에서 말했듯이 이것은 추악한 정규식이지만 작동하고 내 제안은 파서를 사용하기 때문에 아무 것도 보이지 않게되었습니다. 마음에. – Sylverdrag

0

.*?는 모든 방법 <br />의 끝으로 이동

은 (내가하는 XPath 예제를 제공하는 것입니다,하지만 ... :) 내-배울 수있는 목록에 아직). 그런 다음 다음 텍스트는 " </td>"이므로 미리보기가 실패하고 일치가 성공하며 캡처는 "<td class="generalinfo_right">1 S Main St Ste 1430<br />"입니다. 즉, 너무 늦기 때문에 미리보기가 경기를 방해하지 않습니다.

는 제대로 쓸 수있는 방법이있다 (예를 들어, 사용자가 명시 적으로 추가 할 수있는 <tr> 다음 <td class="generalinfo_right"> 그러나 찰스는 당신이 진짜 파서를 사용하는 것이 옳다

관련 문제