2011-08-13 2 views
2

같은 태그의 클래스 명을 배열로 HTML의 문자열 :PHP 분할 내가 좋아하는 HTML 텍스트의 문자열을 취할 필요가 키

<p>This is a line with no spans<br> 
This is a line <span class="second">This is secondary</span><br> 
This is another line <span class="third">And this is third</span> <span class="four">this is four</span></p> 

을 그리고 같은 PHP에서 배열로 끝날 있습니다

그것은 자신의 값으로 각 라인을 얻기 쉬웠다
array(
    "This is a line with no spans", 
    array(
     "This is a line", 
     second => "This is secondary", 
    ), 
    array(
     "This is another line", 
     third => "And this is third", 
     four => "this is four" 
    ) 
); 

, 방금 <BR>에 텍스트를 분할하고는 잘 작동하지만 점점 라인은 내가 확실히 얻을 수없는 클래스 이름으로 분할 할 수 있습니다. 나는 php의 preg_split 키를 잡을 수 있다고 생각하지만, 나는 정규 표현식을 빨아 먹는다. 알아낼 수 없다.

아이디어가 있으십니까?

답변

1

정규 표현식을 사용하여 HTML (cite)을 구문 분석하는 것은 좋지 않습니다. 그것은 단지 적절한 도구가 아닙니다. @JAAulde's answer을 참조하십시오.

가장 좋은 방법은 순전히 DOM을 사용하는 것입니다. 모든 자식 노드 (텍스트 노드 포함)를 반복하여 배열을 원하는대로 포맷하십시오. 이처럼 :

$p = // get paragraph tag... 
$lines = array(); 
$pChildren = $p->childNodes; 
for ($i = 0; $i < $pChildren->length; $i++) { 
    $line = array(); 
    $child = $pChildren->item($i); 
    if ($child instanceof DOMText) { 
     $line[] = $child->wholeText; 
    } elseif ($child instanceof DOMElement) { 
     if (strtolower($child->tagName) == 'br') { 
      $lines[] = $line; 
      $line = array(); 
     } elseif (strtolower($child->tagName) == 'span' && $child->hasAttribute('class')) { 
      $line[$child->getAttribute('class')] = $child->nodeValue; 
     } 
    } 
} 

경고 :는 의사 코드로 위의 치료, 그것은 바로 경험과 수동에서가는, 전혀 테스트되지 않았습니다.

+0

방금이 글을 끝내고 돌아와서 대답을 보았습니다. 거의 동일합니다. –

+1

나중에 같은 질문을하는 사람들을 위해, 나는 이것이 정답이라는 것에 대해 논쟁하지 않습니다. 그러나 OP가 무엇을 대답으로 받아들이는지 알 수없는 단계는 PHP DOM 문서에 대한 마크 업을 읽는 것입니다. 문서에 대한 링크는 내 대답을 참조하십시오. – JAAulde

+0

@JAAulde : 훌륭한 점, 나는 그것을 암시하고 대답을 참조 할 것입니다. – Jonah

1

XML 파서를 사용할 수 있습니까? Here 님의 문서입니다.

3

HTML을 정규식 또는 다른 방법으로 구문 분석하지 마십시오. 그것은 매우 복잡하며 심각한 유지 보수 문제로 끝날 것입니다.

마크 업 덩어리를 DOM 문서 [docs]로 읽는 방법을 살펴본 다음 DOM 메서드를 사용하여 브라우저 측과 마찬가지로 작업 할 것을 적극 권장합니다.

+0

Dom 태그를 사용하여 p 태그를 얻는 데는 DomDocument가 사용되었지만 텍스트가되지 않고 줄 바꿈을 할 때 줄 바꿈을 할 수있는 방법을 찾지 못했습니다. –

+0

줄 바꿈을 할 때 분할하지 않겠습니다. 노드를 살펴보고 유형과 이름을 확인합니다 (텍스트 노드가 있습니까? BR 요소가 있습니까?). 그 정보로 결정을 내립니다. – JAAulde

+0

@aron 내 대답을 참조하십시오. – Jonah

관련 문제