2012-10-19 13 views
1

다음 정규 표현식을 기반으로 웹 페이지에서 일치 항목을 얻고 싶습니다. (. *) regexpal.com (온라인 정규 표현식 테스트 도구)에서 테스트하여 정상적으로 작동합니다. 그러나 PHP에서 사용할 때 일치하는 항목을 찾을 수 없습니다. PHP에서 사용하는 문은preg_match_all이 예상대로 작동하지 않습니다.

preg_match_all("/<a href=\"\/title\/.*\/\">(.*)<\/a>/", $content, $matches); 

$ 콘텐츠를 확인했습니다. 맞습니다. 내 진술에 잘못된 것이 있습니까? 감사!

+0

(. *) 대신 (. *) – Adam

+0

이상한 시도하십시오. 그 정규식에 의해 다루어 져야하는 실제 HTML 예제를 보여줄 수 있습니까? – raina77ow

+0

정규식을 사용하여 HTML을 구문 분석하지 마십시오. PHP DOM 모듈을 사용하십시오. http://htmlparsing.com/php.html –

답변

4

을 제발, 제발 추가하여 정규식 패턴이 게으른 (비 욕심)해야 /에 URL 또는 HTML 포함 당신은 그것을 도처에 탈출해야합니다. 끔찍하다. 여기 봐 :

preg_match_all('~<a href="/title/[^">]+/">(.*?)</a>~si', $content, $matches); 
  1. 싱글을 인용. 더 이상 큰 따옴표를 이스케이프 할 필요가 없습니다. 확장 가능한 '{$ 변수}'가 없는데 왜 큰 따옴표를 사용 하시겠습니까?
  2. 예약되지 않은 문자에 RegExp 줄 바꿈. URL과 HTML /은 최악의 선택입니다. 중복성을 피하기 위해 드래그합니다.
  3. 플래그로 'si'를 사용하십시오. HTML의 태그은 여러 줄 및. +? 또는. *? 기본적으로 멀티 라인과 일치합니다. 그리고 당신은 무감각해야합니다.
  4. 사용하지 마십시오. +? 속성에. 전체 태그를 캡처 할 수 있습니다. 끊기 문자도 추가하십시오. 위의 패턴을 참조하십시오. HTML이 손상된 경우이를 수행하지 마십시오.

이 방법을 개선하는 방법은 많이 있지만 이렇게해야합니다.

희망이 있습니다.

+1

이것은 매우 양호합니다. 정말 좋은 정규 표현식 팁 많이, 마지막 세 PHP뿐만 아니라 밖으로 actionable 있습니다. 작동하는 경우 이것은 받아 들여진 대답이어야합니다 (의심 스럽습니다). – FrankieTheKneeMan

0
preg_match_all("/<a href\=\"\/title\/.*\/\">(.*?)<\/a>/", $content, $matches); 

나는 시도 할 것이다 : 간결

preg_match_all('/<a href\=".title.*">(.*?)<\/a>/', $content, $matches); 

합니다.

1

당신은 거래를 정규 표현식을 포장하지 않는 하나님의 사랑을 ..., ? >>

preg_match_all("/<a href=\"\/title\/.*?\/\">(.*?)<\/a>/", $content, $matches); 
+0

'='도 이스케이프해야합니다. 맞습니까? – Adam

+1

@Adam - 탈출 할 필요 없음'= ' –

+0

+1 잘 알고 있습니다. – Adam

관련 문제