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

php为每个div标记获取嵌套标记之间的内容,php,regex,rss,Php,Regex,Rss,我对PHP非常陌生,一直在尝试寻找一个在线示例来说明我在搜索什么,以便生成一个没有数据库的XML文件 以下是情况和我正在尝试做的事情: includes/articles.php包含许多包含文章链接的div 物品分类示例: <div class="article random-class-varying-between-divs"> <span class="article-title"> <h4><a href="ARTICLE URI HERE" t

我对PHP非常陌生,一直在尝试寻找一个在线示例来说明我在搜索什么,以便生成一个没有数据库的XML文件

以下是情况和我正在尝试做的事情:

includes/articles.php包含许多包含文章链接的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>

这不是测试,但应该给你一个良好的开端,以实现你想要的

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

可以使用转换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);
注意,我使用了hasClass来确保class属性包含类article,而不是articleblah或articlebluh。要做到这一点,XPath函数包含的内容是不够的

使用XSLT的主要好处是,您可以对其他HTML或XML文档使用相同的样式表,而只需进行很少的更改。您需要更改的只是此处的match属性:包含article和select属性的根元素的路径


articles.php不是动态生成的吗?你不能从同一个数据源生成rss xml,而不是通过html元素生成吗?啊,这只是一个我手工编写的html文件。它只使用了.php扩展名,这样我就可以添加几行代码。用DOMDocument解析它-比regexokay容易得多,解决方案是将它加载到DOMDocument并迭代节点
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);