2014-01-19 2 views
2
// Find all element has attribute id 
$ret = $html->find('*[id]'); 

Это пример поиска всех элементов с идентификатором атрибута. Есть ли способ найти все элементы. Я стараюсь этим путем, но он не работает:Как найти все элементы с PHP Простой HTML DOM Parser?

// Find all element 
$ret = $html->find('*'); 

дополнительно:

Я хочу получать через все элементы в $ HTML, все родители и Чайлдс элементы будут извлечены. Пример:

<div> 
    <span> 
     <div>World!</div> 
     <div> 
      <span>Hello!</span> 
      <span> 
       <div>Hello World!</div> 
      </span> 
     </div> 
    </span> 
</div> 

Теперь я хочу, чтобы избежать всех <span> с их открытым текстом внутри и держать все <div> у нас есть! Ожидаемый результат:

<div> 
    <div>World!</div> 
    <div> 
     <div>Hello World!</div> 
    </div> 
</div> 

ответ

0
/** 
* Refine the input HTML (string) and keep what was specified 
* 
* @param $string : Input HTML 
* @param array $allowed : What will be kept? 
* @return bool|simple_html_dom 
*/ 
function crl_parse_html($string, $allowed = array()) 
{ 
    // String --> DOM Elements 
    $string = str_get_html($string); 
    // Fetch child of the current element (one by one) 
    foreach ($string->find('*') as $child) { 
     if (
      // Current inner-text contain one or more elements 
      preg_match('/<[^<]+?>/is', $child->innertext) and 
      // Current element tag is in maintained elements array 
      in_array($child->tag, $allowed) 
     ) { 
      // Assign current inner-text to current filtered inner-text 
      $child->innertext = crl_parse_html($child->innertext, $allowed); 
     } else if (
      // Current inner-text contain one or more elements 
      preg_match('/<[^<]+?>/is', $child->innertext) and 
      // Current element tag is NOT in maintained elements array 
      !in_array($child->tag, $allowed) 
     ) { 
      // Assign current inner-text to the set of inner-elements (if exists) 
      $child->innertext = preg_replace('/(?<=^|>)[^><]+?(?=<|$)(<[^\/]+?>.+)/is', '$1', $child->innertext); 
      // Assign current outer-text to current filtered inner-text 
      $child->outertext = crl_parse_html($child->innertext, $allowed); 
     } else if (
      (
       // Current inner-text is only plaintext 
       preg_match('/(?<=^|>)[^><]+?(?=<|$)/is', $child->innertext) and 
       // Current element tag is NOT in maintained elements array 
       !in_array($child->tag, $allowed) 
      ) or 
      // Current plain-text is empty 
      trim($child->plaintext) == '' 
     ) { 
      // Assign current outer-text to empty string 
      $child->outertext = ''; 
     } 
    } 
    return $string; 
} 

Это мое решение, я сделал это, я просто опубликовать здесь, если кому-то это нужно и закончить этот вопрос.
Обратите внимание, что: Эта функция использует рекурсивный. Таким образом, слишком большие данные будут большой проблемой. Внимательно передумайте, когда решите использовать эту функцию.

1

Ваш пример, кажется, работает нормально, попробуйте следующее, которое выведет внутренний текст каждого элемента.

foreach($html->find('*') as $test) 
    echo $test->innertext; 

Например:

$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>'); 

Выходы

HelloWorld 
+0

Что делать, если $ HTML является '

Hello
World
mama
'. Я имею в виду, что хочу получить весь элемент из $ html, от родителей до детей. – Manhhailua

+0

Это не то, как работает доступ к DOM, см. Мое редактирование. Можете ли вы предоставить некоторый HTML и ожидаемый результат. Вам нужно получить доступ к дереву DOM с помощью таких методов, как '$ html-> children()' –

+0

. Я добавил некоторые детали к основному вопросу, вы можете взглянуть на него. – Manhhailua

0
GLOBAL $elements; 
$elements=array(); 

findElements($fullHTML); 

function findElements($html){ 

    global $elements; 

    $art_html = new simple_html_dom(); 
    $art_html->load($html); 

    foreach ($art_html->find("*") as $element) { 

      $elements[]=$element; 
      findElements($element->innertext); 
    } 

} 

я пишу эту функцию, чтобы найти все элементы

+1

Объясняя, что ваша функция делает шаг за шагом может помочь будущему SO члены. – Elias

Смежные вопросы