2010-07-21 3 views
2

나는 내가 preg_match에 PHPregex를 사용하여 HTML에서 문자열을 가져 오는 방법은 무엇입니까?

if(preg_match('<\/div>(.*?)<div class="adsdiv">', $data, $t)) 

이 블록을 시도 할 수 있도록 HTML 페이지에서 블록을 구문 분석을 시도하고 있지만

</div> 

blablabla 

blablabla 

blablabla 

<div class="adsdiv"> 

내가 원하는 작동하지 않습니다 그렙 만 blablabla blablabla 단어 도움

+0

정확히 일치하는 HTML 텍스트를 정확히 설명해주십시오. – ULysses

답변

-1

정규 표현식을 구분해야합니다. 대신 /<\/div>(.*?)<div class="adsdiv">/을 사용하십시오. PHP Manual에서

+0

OP의 문제는 해결되지 않지만 * 유효한 포인트입니다. 질문에있는 정규 표현식에는 구분 기호가 없으므로 사용하려고하면 예외가 발생합니다. –

0

:

의 (PCRE_DOTALL) -이 변경자를 지정하면, 패턴의 점 메타 문자는 뉴 라인을 포함하는 모든 문자, 일치합니다. 그것 없이는, 개행이 제외됩니다. 이 변경자 은 Perl의/s 수정 자와 동일합니다. [^ a]와 같은 음수 클래스는 항상 이 한정자의 설정과 관계없이 줄 바꿈 문자 과 일치합니다.

그래서, 다음과 같은 작업을해야합니다 :

if (preg_match('~<\/div>(.*?)<div class="adsdiv">~s', $data, $t)) 

~

은 정규 표현식이 구분한다.

+0

대단히 Alix의 작품에 고마워요 – normand

1

위에서 언급 한 내용 외에도 /s 수정자를 추가하여 .이 개행과 일치합니다. (편집 : 앨런이 친절하게 지적했듯이 [^<]+은 줄 바꿈 문자와 일치합니다.)

이 경우 항상 기본적으로 최소 일치를 원하므로 항상 /U을 사용합니다. (더 빠를 것입니다). 그리고 사람들이 <div>, <DIV>, 또는 <Div> ...

if (preg_match('/<\/div>([^<]+)<div class="adsdiv">/Usi', $data, $match)) 
{ 
    echo "Found: ".$match[1]."<br>"; 
} else { 
    echo "Not found<br>"; 
} 

편집이 좀 더 명시 적으로 만든 말 /i 때문에!

+0

답장을 보내 주셔서 감사합니다 mvds하지만 그것은 작동하지 않는 빈 결과 의미로 회신하십시오 – normand

+0

좋아, 나는 그것을 밖으로 일치하는 부분을 얻는 방법을 보여주는 약간의 코드를 추가했습니다. 이것은 작동해야합니다. (입력 내용이 여러분이 보여주는 것, 즉 firefox와 같은 "view source"와 같은 일부 형식의 HTML이 아닌!) – mvds

+0

'[^ <]'는'/s' 수식자를 선택합니다. –

1

Regex aint the right tool for this. 다음은 HTML 문서에서

$html = <<< HTML 
<div class="parent"> 
    <div> 
     <p>previous div<p> 
    </div> 
    blablabla 
    blablabla 
    blablabla 
    <div class="adsdiv"> 
     <p>other content</p> 
    </div> 
</div> 
HTML; 

콘텐츠 TextNodes입니다 DOM 방법으로 할 수 있습니다. 태그는 ElementNodes입니다. blablabla의 내용이있는 TextNode에는 부모 노드가 있어야합니다. TextNode 값을 가져 오는 경우, 우리는 그것을, 펑키 한 라이너 아니다 당신이 adsdiv

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xPath = new DOMXPath($dom); 
$nodes = $xPath->query('//div[@class="adsdiv"]'); 
foreach($nodes as $node) { 
    foreach($node->parentNode->childNodes as $child) { 
     if($child instanceof DOMText) { 
      echo $child->nodeValue; 
     } 
    }; 
} 

네의 class 속성으로 div의 인 parentNode의 모든 TextNode을한다고 가정하지만 그것은 또한 두통의 더 적은이고 HTML 문서를 확실하게 제어 할 수 있습니다. XPath에의 쿼리 힘을 모으고, 우리는 나는 그것이 deliberatly 자세한하지만 DOM을 사용하는 방법을 설명하기 위해 유지

$nodes = $xPath->query('//div[@class="adsdiv"]/../text()'); 
foreach($nodes as $node) { 
    echo $node->nodeValue; 
} 

위를 단축 할 수 있었다.