首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用简单的Html dom解析器进行Html解析

使用简单的Html dom解析器进行Html解析
EN

Stack Overflow用户
提问于 2009-12-24 13:33:23
回答 3查看 3.1K关注 0票数 2

我正在使用简单的html dom解析器来解析一些html。

我有一个像这样的html

代码语言:javascript
复制
<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>

我的代码是

代码语言:javascript
复制
$storyMessageNodes    = $story->find('span.UIStory_Message');
$storyMessage         = strip_tags($storyMessageNodest->innertext);

我想要将文本放在span "UIStory_Message“中。比如,“是啊,长生不老药!”

但是上面的代码给了我整个范围内的整个文本。例如,“耶,长生不老药!asdfsdfasdfsdf 61193133389&ref=nf”

我的代码怎么能让它只给出“耶,长生不老药!”??

EN

回答 3

Stack Overflow用户

发布于 2010-09-22 22:17:16

我已经写了一个方法来消除在抓取的DOM节点中不需要的元素,我已经联系了作者,但简单的dom已经两年没有活动了,所以我怀疑他会把它包含在发行版中。这就是它:

代码语言:javascript
复制
/**
 * 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类或扩展它的类中。在asker的情况下,您可以这样使用它:

代码语言:javascript
复制
$storyMessageNodes = $story->find('span.UIStory_Message');
$storyMessage = $storyMessageNodes[0]->removeNodes('a')->plaintext
票数 5
EN

Stack Overflow用户

发布于 2009-12-24 13:39:40

你可以这样做:

代码语言:javascript
复制
$result = $story->find('span.UIStory_Message');

然后在第一个<上使用substr();另一种选择是编写一个简单的正则表达式。

我还没有测试过,这只是基于文档的胡乱猜测,试着这样做:

代码语言:javascript
复制
$story->find('span.UIStory_Message')->plaintext; // same result as strip_tags()?

或者:

代码语言:javascript
复制
$story->find('span.UIStory_Message')->find('text');

如果那不起作用,try playing with these options

票数 1
EN

Stack Overflow用户

发布于 2012-07-19 15:00:36

当您只删除外部文本时,您将删除HTML内容本身,但是如果您对相同的元素执行另一次查找,则它将出现在结果中。原因是简单的HTML DOM对象仍然具有元素的内部结构,只是没有其实际内容。要真正删除元素,只需将HTML作为字符串重新加载到同一个变量。这样,将在没有删除内容的情况下重新创建对象,并且在没有删除内容的情况下构建简单的HTML DOM对象。

下面是一个示例函数:

代码语言:javascript
复制
public function removeNode($selector)
{
    foreach ($html->find($selector) as $node)
    {
        $node->outertext = '';
    }

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

把这个函数放在simple_html_dom类中就可以了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1956850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档