2010-12-31 9 views
1

PHPのXPathでいくつかのことをするのに助けが必要です。任意のHTMLでPHPとXPathのヘルプ

、私が行う必要があります。

  • は、すべてのテーブルとその内容
  • を削除する最初のH1タグ
  • 後、すべてを削除し、その内側のHTMLのみを含む段落((リンク、リストにしてくださいなど))

正規表現では、私は完全に動作しています。しかし、ネストしたテーブルに遭遇したとき、私は正規表現でHTMLを解析するのは本当に愚かであると判断しました。

ありがとうございます!

+0

未処理(x)XSLTを使用したHTMLは単純に愚かです。あなたの(x)Htmlと望む結果の完全な例を提供してください。 –

+0

良い質問、+1。完全で短いXSLTソリューションについては私の答えを見てください。 :) –

答えて

1

を、私が行う必要があります。

•すべてのテーブルとその内容

を削除します

•最初のh1の後にすべてを削除します。 タグ

•これは、XSLTで非常に簡単に行うことができます( その内側のHTML(リンク、リスト、など)を含む)のみ段落

をしてください:

あなたの要素の場合
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:h="http://www.w3.org/1999/xhtml" > 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- Copy every node except when overriden 
     by another template --> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<!-- Remove all tables and their contents --> 
<xsl:template match="h:table"/> 

<!-- Remove everything after the first h1 --> 
<xsl:template match="node()[preceding::h:h1]"/> 

<!-- Keep only paragraphs (INCLUDING 
     their inner HTML (links, lists, etc)) 
    --> 
<xsl:template match= 
"node()[not(self::h:p) and not(ancestor::h:p)]"> 
    <xsl:apply-templates/> 
</xsl:template> 
</xsl:stylesheet> 

名前がXHtml名前空間にない場合は、上記のコードでh:の出現を単純に削除してください。

+0

これはとてもいいです。私はXSLTを読む必要があります。これらのソリューションをPHPに組み込むにはどうすればよいですか? XPathクエリを使用するのと似ていますか? – Peter

+0

@Peter:私はPHPを使用していませんが、AFAIK PHPはLibXml/LibXsltプロセッサを使用しています。インターネット上でそれを検索するだけで、多くの例があるはずです。 –

+0

+1良い答え。 –

0

HTML DOMパーサーを使用することを検討してください。これはXMLよりはるかに簡単です。 xpathステートメントもサポートするパーサーがいくつかあります。しかし、トリッキーな部分は、すべてのHTMLが厳密なxhtml標準に準拠しているわけではないので、ルールが必ずしも適用しにくいということです。ここに私が出会ったいくつかのDOMパーサがあります。いくつかのサポートのXPathと一部だけでコンテンツを選択する他の方法があります任意のHTMLで

http://simplehtmldom.sourceforge.net/

http://php.net/manual/en/simplexmlelement.xpath.php

+0

代わりに[DOM](http://php.net/manual/en/book.dom.php)を実際に使用する[SimpleHtmlDom](http://simplehtmldom.sourceforge.net/)のサードパーティの代替案を提案しました。文字列の解析:[phpQuery](http://code.google.com/p/phpquery/)、[Zend_Dom](http://framework.zend.com/manual/en/zend.dom.html)、[QueryPath ](http://querypath.org/)および[FluentDom](http://www.fluentdom.org)。 – Gordon