我正在使用简单的html dom解析器来解析一些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);我想要将文本放在span "UIStory_Message“中。比如,“是啊,长生不老药!”
但是上面的代码给了我整个范围内的整个文本。例如,“耶,长生不老药!asdfsdfasdfsdf 61193133389&ref=nf”
我的代码怎么能让它只给出“耶,长生不老药!”??
发布于 2010-09-22 22:17:16
我已经写了一个方法来消除在抓取的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类或扩展它的类中。在asker的情况下,您可以这样使用它:
$storyMessageNodes = $story->find('span.UIStory_Message');
$storyMessage = $storyMessageNodes[0]->removeNodes('a')->plaintext发布于 2009-12-24 13:39:40
你可以这样做:
$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。
发布于 2012-07-19 15:00:36
当您只删除外部文本时,您将删除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类中就可以了。
https://stackoverflow.com/questions/1956850
复制相似问题