2016-07-09 4 views
1

페이지의 요소와 내용 구조를 기반으로 자동 글꼴 요청 최적화를 구현하려고합니다. PHP DomDocument를 사용하여 필요한 정보를 얻는 방법은 무엇입니까? 상기 소자 구조는 두 가지 예에서 동일하다PHP DomDocument를 사용하여 요소 및 내용 구조를 얻는 방법은 무엇입니까?

예 1

<p><em>All italic paragraph text</em></p> 

예 2

<p>Normal paragraph text <em>and some italic text</em></p> 

:

은 요컨대 문제는 두 구조의 예와 함께 설명 될 수있다 즉 <em> 하위 요소가있는 단락 요소입니다. 그러나, 내용 구조는 다른 모든 텍스트가 예 1에서 기울임 꼴이지만, 예를 정상 및 기울임 꼴 텍스트 2.

요소 구조를 얻기를위한 나의 현재 접근 방식은이 같은 것을 모두가 :

$dom = new DOMDocument; 
foreach ($dom->getElementsByTagName('p') as $elm) { 
    $elms[] = $dom->saveHTML($elm); 
} 

그런 다음 물마루를 반복하고 <em><strong>과 같이 중첩 된 요소를 찾는 데 동일한 방법을 사용합니다.

하지만 콘텐츠 구조에 대한 좋은 접근 방식이 필요합니다. 나는 <em></em>으로 텍스트를 나눌 수 있고, 결과리스트의 첫 번째 요소와 마지막 요소가 길이가 있는지를 알 수 있지만, 여기서는 가장 권장하지 않는 접근법 인 것으로 보이는 regex를 사용하여 사용자 정의 HTML 검색을 생각 나게합니다.

하지만이 경우 내 대안은 무엇입니까?

답변

1

당신은 각각의 텍스트 노드를 찾을 수 DOMXPath를 사용할 수 있습니다

$html = "<p>Normal paragraph text <em>and some italic text</em></p>"; 

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXpath($dom); 
$textNodes = $xpath->query("//text()"); 
$elms = []; 
foreach ($textNodes as $elm) { 
    $elms[] = array(
     "parent" => $elm->parentNode->tagName, 
     "path" => $elm->parentNode->getNodePath(), 
     "text" => $elm->textContent 
    ); 
} 

$elms이 포함됩니다

array (
    array (
    'parent' => 'p', 
    'path' => '/html/body/p', 
    'text' => 'Normal paragraph text ', 
), 
    array (
    'parent' => 'em', 
    'path' => '/html/body/p/em', 
    'text' => 'and some italic text', 
), 
) 
+0

대단히 감사합니다! 이것은 정확하게 내가 찾고 있었던 것 같습니다. DomDocument가 아니지만 stil native php입니다. 감사. –