2009-12-24 2 views
1

Я использую простой анализатор html dom для анализа некоторого html.Анализ HTML с использованием простого анализатора HTML Html

У меня есть HTML как этот

<span class="UIStory_Message"> 
    Yeah, elixir of life!<br/> 
    <a href="asdfasdf"> 
     <span>asdfsdfasdfsdf</span> 
     <wbr/> 
     <span class="word_break"/> 
     61193133389&ref=nf 
    </a> 
</span> 

Мой код

$storyMessageNodes = $story->find('span.UIStory_Message'); 
$storyMessage   = strip_tags($storyMessageNodest->innertext); 

Я хочу, чтобы получить текст прямо в пролете "UIStory_Message". т.е. «Да, эликсир жизни!».

, но приведенный выше код дает мне весь текст, который находится внутри всего диапазона. т.е. «Да, эликсир жизни! Asdfsdfasdfsdf 61193133389 & исх = Н.Ф.»

как мог я код так, что он дает только «Да, эликсир жизни!» ??

ответ

1

Вы можете сделать что-то вроде этого:

$result = $story->find('span.UIStory_Message'); 

А потом substr() на первом <; еще один вариант - написать простое регулярное выражение.


Я не проверял, это просто дикая догадка, основанная на документации, попытайтесь делать:

$story->find('span.UIStory_Message')->plaintext; // same result as strip_tags()? 

Или:

$story->find('span.UIStory_Message')->find('text'); 

Если это не работает, try playing with these options.

+0

Я знаю, что это сработает .... но я должен знать, есть ли какие-либо прямые методы в simple_html_dom.php для этого? – Andromeda

5

Я написал метод, чтобы избавиться от ненужных элементов в выбранных узлах DOM, я связался с автором, но простой dom не был активным в течение двух лет, поэтому я сомневаюсь, что он включит его в дистрибутив. Вот оно:

/** 
* remove specified nodes from selected dom 
* 
* @param string $selector 
* @param int|array (optional) possible values include: 
* + positive integer - remove first denoted number of elements 
* + negative integer - remove last denoted number of elements 
* + array of ones and zeroes - remove the respective matches that equal to one 
* 
* eg. 
* // will remove first two images found in node 
* $dom->removeNodes('img',2); 
* 
* // will remove last two images found in node 
* $dom->removeNodes('img',-2); 
* 
* // will remove all but the third images found in node 
* $dom->removeNodes('img',array(1,1,0,1)); 
* 
* [!!!] if there are more matches found than elements in array, the last array member will be used for processing 
* 
* eg. 
* // will remove second and every following image 
* $dom->removeNodes('img',array(0,1)); 
* 
* // will remove only the second image 
* $dom->removeNodes('img',array(0,1,0)); 
* 
* @return simple_html_dom_node 
*/ 
public function removeNodes($selector, $limit = NULL) 
{ 
    $elements = $this->find($selector); 
    if (empty($elements)) return $this; 


    if (isset($limit) && is_int($limit) && $limit < 0) { 
     $limit = abs($limit); 
     $elements = array_reverse($elements); 
    } 

    foreach ($elements as $element) { 

     if (isset($limit)) { 

      if (is_array($limit)) { 
       $current = current($limit); 
       if (next($limit) === FALSE) { 
        end($limit); 
       } 
       if (!$current) { 
        continue; 
       } 
      } else { 
       if (--$limit === -1) { 
        return $this; 
       } 
      } 
     } 

     $element->outertext = ''; 

    } 

    return $this; 
} 

положить его в simple_html_dom_node класса или одного продления. В случае аскеров вы бы использовать его как это:

$storyMessageNodes = $story->find('span.UIStory_Message'); 
$storyMessage = $storyMessageNodes[0]->removeNodes('a')->plaintext 
+0

Как я могу заставить эту функцию удалить весь элемент, включая внутренний текст элемента, а не только теги элементов? – emkay

0

, когда вы только удалить внешний текст, который вы удалить содержимое HTML сам, но если вы выполняете другое найти на один и те же элементы, что будет появляться в результате. причина в том, что простой объект HTML DOM по-прежнему имеет внутреннюю структуру элемента, только без его фактического содержимого. что вам нужно сделать, чтобы действительно удалить элемент, просто перезагрузите HTML как строку в одну и ту же переменную. таким образом, объект будет воссоздан без удаленного содержимого, а простой объект HTML DOM будет построен без него.

здесь пример функции:

public function removeNode($selector) 
{ 
    foreach ($html->find($selector) as $node) 
    { 
     $node->outertext = ''; 
    } 

    $this->load($this->save());   
} 

положить эту функцию внутри класса simple_html_dom и вы хорошо.

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