Разбор HTML с использованием Simple Html dom parser - PullRequest
2 голосов
/ 24 декабря 2009

Я использую простой 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 & ref = nf"

как я мог написать так, чтобы он давал только "Да, эликсир жизни!" ??

Ответы [ 3 ]

5 голосов
/ 22 сентября 2010

Я написал метод избавления от ненужных элементов в извлеченных узлах 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
1 голос
/ 24 декабря 2009

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

$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');

Если это не сработает, попробуйте поиграть с этими опциями .

0 голосов
/ 19 июля 2012

когда вы удаляете только внешний текст, вы удаляете само содержимое 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, и все хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...