문제

내용을 검색해야합니다 <p> 주어진 클래스로 태그. 수업이 될 수 있습니다 simplecomment 또는 comment ...

그래서 나는 다음 코드를 썼습니다

preg_match("|(<p class=\"(simple)?comment(.*)?\">)(.*)<\/p>|ism", $fcon, $desc);

불행히도, 그것은 아무것도 반환하지 않습니다. 그러나 태그 엔딩 부분을 제거하면 (<\/p>) 어떻게 든 작동하여 너무 긴 문자열을 보호합니다 (태그 시작부터 문서 끝까지) ...

내 정규 표현에 어떤 문제가 있습니까?

도움이 되었습니까?

해결책

DOM 파서처럼 사용해보십시오 http://simplehtmldom.sourceforge.net/

SimpleHtmdom의 홈페이지에서 예제 코드를 올바르게 읽으면 다음과 같은 작업을 수행 할 수 있습니다.

$html->find('div.simplecomment', 0)->innertext = '';

다른 팁

여기서 빠른 수정은 다음과 같습니다.

'|(<p class="(simple)?comment[^"]*">)((?:[^<]+|(?!</p>).)*)</p>|is'

변경 :

  • 구성 (.*) 정규 표현이 작동하는 것을 막는 모든 것을 맹목적으로 일치시킬 것이므로 인스턴스를 더 엄격한 일치로 완전히 대체했습니다.
    1. ...comment(.*)?... - 이것은 기본적으로 전부 또는 전혀 일치합니다. 나는 이것을 대체했다 [^"]* 그것은 0 이상과 일치하기 때문에" 문자 (기본적으로 마감과 일치합니다. " 의 성격 class 기인하다.
    2. ...>)(.*)<\/p>... - 다시, 이것은 너무 많이 일치 할 것입니다. 나는 그것을 모든 비에 맞는 효율적인 패턴으로 대체했습니다.< 캐릭터, 그리고 일단 닿으면 a < 다음과 같은 지 확인합니다 </p>. 그것이 있다면, 그것은 일치를 중단 할 것입니다 (우리는 끝났기 때문에 <p> 태그), 그렇지 않으면 계속됩니다.
  • 나는 그것을 제거했다 m 이 정규 표현에 사용되지 않기 때문에 플래그.

하지만 신뢰할 수 없습니다 (상상해보십시오 <p class="comment">...<p>...</p></p>; 일치합니다 <p class="comment">...<p>...</p>).

신뢰할 수 있으려면 재귀적인 정규 표현식 또는 HTML 파서 (또는 XHTML 인 경우 XML)를 사용해야합니다. "올바르게"HTML을 처리 할 수있는 라이브러리도 있습니다. 브라우저처럼.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top