2012-04-27 4 views
3

안녕하세요. 제 질문을 보아 주셔서 감사합니다. HTML 스 니펫에서 일부 데이터를 가져와야합니다. 이 소스는 신뢰할 수있는/구조화 된 소스이므로이 HTML에서 regex를 사용하는 것이 좋습니다. 돔 및 PHP의 다른 고급 기능은 과잉입니다.PHP - DIV 태그의 내용을 가져 오는 정규식

다음은 HTML 스 니펫의 형식입니다.

<div id="d-container"> 
    <div id="row-custom_1"> 
    <div class="label">Type</div> 
    <div class="content">John Smith</div> 
    <div class="clear"></div> 
    </div> 
</div> 

위의 두 DIV 태그에는 ID가 설정되어 있습니다. div 태그처럼 여러 행 custom_1이있을 수 있으므로이 태그를 이스케이프 처리해야합니다.

실제로 저는 정규 표현식에서 매우 가난하므로 위의 HTML 스 니펫에서 John Smith에게 도움을 요청합니다.

<div * id="row-custom_1" * > * <div * class="content" * >GRAB THIS </div> 

과 같이 될 수 있지만 정규식에 그것을하는 방법을 모르겠어요. John Smith 부분에 html이 포함되지 않습니다. 그것은 모든 HTML을 제거하고 위의 형식으로 데이터를 제공하는 신뢰할 수있는 출처에서 온 것입니다.

어쨌든 정규식은 HTML을 처리하는 좋은 방법이 아닙니다. 도움을 주셔서 감사합니다.

30 분 후 바로 편집 : 많은 멋진 사람들이 HTML 파서를 사용하도록 제안했습니다. 매력처럼 일했다. 그래서 누군가가 비슷한 질문을하는 경우, 바보 같은 질문 작성자로서, 나는 직업에 대한 DOM을 사용하는 것이 좋습니다거야.

+9

에 오신 것을 환영합니다! RegEx를 사용하여 HTML을 구문 분석하지 마시기 바랍니다. [당신을 미치게 만듭니다] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) . 대신 [HTML 구문 분석기] (http://stackoverflow.com/questions/292926/robust-mature-html-parser-for-php)를 사용하십시오. –

+0

@ 트루트 : 예, 동의합니다. 나는 이것을 묻기 전에 여기에서 많은 질문을 읽었고, 내가하려고하는 것이 잘못되었다는 것을 깨달았다. 하지만 여기서 HTML 파서를 사용하는 것에 대해 궁금합니다. 사용자의 이름을 페이지의 HTML 제목을 설정하여 각 페이지로드시 일부 덤프를 실행시키려는 시도는 매우 좋은 생각이 아닙니다. html 구조는 동일해야합니다. 다시 한번 감사드립니다. –

+2

소스가 "신뢰할 수있는"경우에도 여전히 유효한지 확인해야합니다. HTML 파서를 사용하십시오 –

답변

5

여기에 주어진 HTML에서 값을 얻을 수있는 간단한 DOM 기반 코드 :

$html = <<< EOF 
<div id="d-container"> 
    <div id="row-custom_1"> 
    <div class="label">Type</div> 
    <div class="content">John Smith</div> 
    <div class="clear"></div> 
    </div> 
</div> 
EOF; 
$doc = new DOMDocument(); 
libxml_use_internal_errors(true); 
$doc->loadHTML($html); // loads your html 
$xpath = new DOMXPath($doc); 
$value = $xpath->evaluate("string(//div[@id='d-container'] 
     /div[@id='row-custom_1']/div[@class='content']/text())"); 
echo "User Name: [$value]\n"; // prints your user name 

출력 : 스택 오버플로

User Name: [John Smith] 
+0

매력처럼 작동하는 OMG, @anubhava !!! 대단히 감사합니다! HTML에 regex를 절대 사용하지 마십시오! 15 명이 여기에 오기 전에 투표 버튼을 사용할 수 있기를 바랍니다. –

+1

SO 커뮤니티에 오신 것을 환영합니다. HTML을 구문 분석하기 위해 정규 표현식을 사용하는 사람조차도 막을 수는 있지만,이 대답을 제공하기 위해 5 분을 소비 할 가치가 있다고 생각합니다. 또한 나는 지금 당신의 질문에서 15 명 이상의 담당자가 있다고 생각합니다 :) – anubhava

관련 문제