php为每个div标签获取嵌套标签之间的内容

时间:2015-10-19 08:23:06

标签: php regex rss

我是PHP的新手,并且一直试图找到我正在搜索的在线示例,以便生成XML文件(没有数据库)。

以下是我的情况和尝试:

includes/articles.php包含许多包含文章链接的div。

文章div的例子:

<div class="article random-class-varying-between-divs">
<span class="article-title">
<h4><a href="ARTICLE URI HERE" title="ARTICLE TITLE HERE">ARTICLE TITLE HERE</a></h4>
</span>
</div>

现在这里是&#34;伪代码&#34;我正在思考但不明白该怎么做..

rss.php文件内部:

<?php
for every of first 50 <div class="article *">*</div> in includes/articles.php:
<item>
  <title>echo contents_between_h4_<a>_tags</title>
  <link>echo 'http://example.com'uri_from_href_in_h4_<a>_tags</link>
</item>
?>

2 个答案:

答案 0 :(得分:0)

这未经过测试,但应该为您提供实现目标的良好开端......

libxml_use_internal_errors( true );
/* XML will be written to this object */
$xml=new DOMDocument('1.0','UTF-8');
$xml->preserveWhiteSpace=true;

/* HTML is read from this object */
$dom=new DOMDocument;
$dom->validateOnParse=false;
$dom->strictErrorChecking=false;
$dom->recover=true;

/* Change the path!! */
$dom->loadHTMLFile( '/path/to/your/page.html' );

libxml_clear_errors();

/* Find all the a tags in html & loop through */
$col=$dom->getElementsByTagName('a');
foreach( $col as $index => $node ){
    /* Add a node to your xml output */
    $item=$xml->createElement('item');
    $xml->appendChild( $item );

    /* Add child nodes to the `$item` */
    $item->appendChild( $xml->createElement('title',$node->nodeValue ) );
    $item->appendChild( $xml->createElement('link', $node->getAttribute('href') ) );
}
/* Save the xml file somewhere */
$xml->save( '/path/to/newxml.xml' );

答案 1 :(得分:0)

可以使用XSLT转换HTML或XML文件,例如:

define('MIN_ITEM', 0);
define('MAX_ITEM', 50);

function hasClass($classAttr, $className) {
    return in_array($className, preg_split('~\s+~', $classAttr));
}

$xsl = <<<'EOD'
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" exclude-result-prefixes="php">
  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
  <xsl:param name="minItem"/>
  <xsl:param name="maxItem"/>
  <xsl:template match="/html/body">
    <rss version="2.0">
      <channel>
        <xsl:for-each select="//div[php:function('hasClass', string(@class), 'article')][position() &lt; $maxItem][position() &gt; $minItem]">
          <item>
            <title><xsl:value-of select="span/h4/a"/></title>
            <link><xsl:value-of select="span/h4/a/@href"/></link>
          </item>
        </xsl:for-each>
      </channel>
    </rss>
  </xsl:template>
</xsl:stylesheet>
EOD;

libxml_use_internal_errors(true); // prevent badly formatted html to display warnings

// $htmlFilePath = './includes/articles.php';
$htmldoc = DOMDocument::loadHTMLFile($htmlFilePath); 
$xsldoc = DOMDocument::loadXML($xsl);

$proc = new XSLTProcessor();
$proc->importStyleSheet($xsldoc);
$proc->registerPHPFunctions('hasClass');
$proc->setParameter('', 'minItem', MIN_ITEM - 1);
$proc->setParameter('', 'maxItem', MAX_ITEM + 1);

echo $proc->transformToXML($htmldoc);

请注意,我使用custom php function hasClass来确保class属性包含类article而不是articleblaharticlebluh。 (要做到这一点,XPath函数contains是不够的。)

使用XSLT的主要兴趣在于,您可以使用相同的样式表,对其他HTML或XML文档进行少量更改。您需要更改的只是此处的match属性:<xsl:template match="/html/body">(包含文章的根元素的路径)和select属性。

An other tutorial