2009-12-24 154 views
1

我使用简单的HTML DOM解析器来解析一些HTML。HTML解析使用简单的HTML DOM解析器

我有这样

<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> 

我的代码的HTML是

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

我要得到正确的跨度 “UIStory_Message” 中的文本。即“是的,生命的灵药!”。

,但上面的代码给我整段文字这是整个跨度内。 即,“是啊,长生不老药!asdfsdfasdfsdf 61193133389 & REF = NF”

我怎能代码,以便它仅给出“是啊,长生不老药!” ??

回答

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

我知道THT将工作....但iwant知道是否有在simple_html_dom.php这样做的任何直接的方法? – Andromeda 2009-12-24 05:41:38

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 2012-01-08 07:55:03

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类中这个功能,你是好。