2010-04-30 2 views
0

HTML로 구성된 문자열과 일치 시키려고합니다. 기본적으로 이미지 갤러리이므로 문자열에 많은 유사점이 있습니다. 문자열에 <dl> 태그가 많이 있지만 </div> 앞에 오는 마지막 <dl>(.?)+</dl> 콤보를 찾습니다.두 태그 사이의 패턴을 제외하고 일치하는 방법

내가 이것을 고안 한 방법은 <dl의 내부에 <dl></dl> 콤보가 들어 있는지 확인하는 것입니다. 나는 다른 태그와 줄 바꿈을 포함하여 그 밖의 무엇이 있는지 신경 쓰지 않습니다.

이 서브 문자열이 얼마나 오래 될지 예측할 수 없기 때문에 정규 표현식을 사용해야한다고 결정했습니다.

여기에만 날이 NULL 모든 인덱스 배열을 돌려 내 현재 정규식 :

preg_match_all('/<dl((?!<dl).)+<\/dl>(?=<\/div>)/', $foo, $bar)

당신은 내가 시도하고이 하나 내의 다른 <dl>가 있는지 부정적 예측을 사용하여 볼 수 있듯이. 나는 또한 동일한 결과로 부정적인 lookbehind를 시도했다. 또한 + 대신 +?을 사용해 보았습니다. <dl><dl></dl> 또는 기타 패턴이 없지만 내 정규식은 첫 번째 <dl>과 마지막 </dl> 또는 전혀 일치하지 않음을 명심하십시오. ,

는 이제 . 줄 바꿈과 일치하지 않습니다 실현하지만 난이 상상할 수있는 무엇이든 시도하고 그것은 여전히 ​​중 하나는 </dl></div><dl의 첫 occurance에서합니다 (NULL의 모든 인덱스 또는 거의 전체 문자열로 날을 제공합니다 어떤 다른 것들은 <dl>입니다. 정확하게 원하지 않는 것들입니다.) 나는 정직하게 내가 뭘 잘못하고 있는지 모릅니다.

도움 주셔서 감사합니다. 나는이 한 가지 문제를 바로 잡기 위해 한 시간 이상을 보냈다. 그리고 그것은 내 머리카락을 끌어 내게했다.

답변

2

Don't use regular expressions for irregular languages like HTML. 대신 parser을 사용하십시오. 많은 시간을 절약 할 수 있습니다. pain.

+0

"모든 문자와 일치, 심지어 라인 나누기" 누군가 자신의 사이트에서 '통증'을 검색 할 때 대답합니다. – soulmerge

+0

답장을 보내 주셔서 감사합니다. 다른 위치에서도 본 적이 있으므로 템플릿으로 응답해야합니다. 필자는 파서를 고려할 것이지만, HTML 파일이 다른 파일에서 생성되는 방식을 정확히 알고 있습니다. 그래서 HTML이 취할 일반적인 형식을 알기 때문에 정규식을 받아 들일만한 해결책이 될 것입니다.또한이 특정 페이지의로드 시간 경계선을 이미 고려했기 때문에 실행을 느리게하고 싶지 않았습니다. – Ryan

0

나는 깔끔하게 사용하는 것이 좋습니다. 깨진 HTML의 경우에도 내용으로 원하는 모든 태그를 쉽게 추가 할 수 있습니다.

일반적으로 정규 표현식을 사용하여 파서를 작성하는 것은 권장하지 않습니다. 그것이 내가이 질문을 게시 내가 일을하는 방법을 발견 약 2 분, 그대로

은 미친 http://www.php.net/tidy

0

를 참조하십시오.

preg_match_all('/<dl([^\z](?!<dl))+?<\/dl>(?=<\/div>)/', $foo, $bar); 

[^\z] 막무가내 내가 말을 사용하는 단지 방법입니다 구글이 그에 대한 링크를 제공 시작할 때 궁금해, 나는 자주이 답변을 게시 한

관련 문제