2011-12-05 17 views
1

最近、HTML文書からすべてのテキストノードを解析するのに助けを受けました。次エキス使用PHP DOM - 特定のHTMLタグを含むテキストノードを解析する

$doc = new DOMDocument(); 
$doc->loadHTML($contents); 
$doc->loadHTML("<p>not in the brackets..</p>"); 
$xpath = new DOMXPath($doc); 
$textnodes = $xpath->evaluate('//text()'); 

:結果のコードは、このだった

<p>This is a <b>nested <i>HTML</i> tag<b>...</p> 

を私は要素の配列を作成することができています:

Array 
(
    [0] => This is a 
    [1] => nested 
    [2] => HTML 
    [3] => tag 
    [4] => ... 
) 

私は実際にやりたい何か、ただし、すべてのテキストノードを取得することですが、特定のHTMLタグを「参照してください」にすることができます。たとえば、<i>,<b><u>タグを個々のノードとして解析することは望ましくありません。むしろ、前のテキストノードに結合されています。上記の配列は、理想的には、次のようになります。

Array 
(
    [0] => This is a nested HTML tag... 
) 

を一方、<p>タグ別々のノードとして認識されるべきです。だから、次のテキスト:

<p>paragraph 1 <b>here</b></p> <p>paragraph 2</b> 

理想として解析されます:

Array 
(
    [0] => paragraph 1 <b>here</b> 
    [1] => paragraph 2 

は、私はいくつかのXPathやPHP DOMについて読ん行っているが、どのように正直に、私は本当に手掛かりを持っていませんこれについて。誰かが私を正しい方向に向けることができますか?ありがとうございました。

編集

ただ、出力は配列形式でなければなりません明確にします。私の目的は、ページからすべてのテキストを解析し、翻訳ファイルで使用できるようにすることです。したがって、完全な文章をまとめるためには、構文解析されたテキストに特定のHTMLタグ(<b>など)が望ましく、新しい翻訳ファイルにマークアップをおおまかに保持する必要があります。

+0

重複している可能性があります。これをチェックしてください:http://stackoverflow.com/questions/2442314/php-simplexml-remove-xpath-node –

+0

@カルヴェン私がその記事を誤解していない限り、質問は私と同じことを求めていません。 – Pete171

+0

重複[http://stackoverflow.com/questions/2087103/innerhtml-in-phps-domdocument](http://stackoverflow.com/questions/2087103/innerhtml-in-phps-domdocument) – pguardiario

答えて

0

実際に分割したいものについては、「見越タグ」でstrip_tagsを使用し、許容タグの2番目のパラメータを使用することを検討してください。

+0

HTMLマークアップ内のテキストを配列として取得する必要があるので、 'strip_tags()'は使用できません。アレイを「区切る」ために役立つタグを削除することは、そのようにするのが難しくなります。おそらく私は私の質問でいくつかの情報を省略しているので、私は今それを編集します。ありがとうございました。 – Pete171

0

あなたはノードを持っているし、プレーンテキストとして、それを正規化する場合:

XPATH: 'string(thenode)' 
DOM: $thenode->textContent; 

これはいないテキストノードであるすべての子ノードを無視して、単一の文字列として返します。

したがって、string(//p)のようなxp​​athは、すべての要素が削除されたプレーンテキストの段落の配列を取得します。 getElementsByTagName()を使用してDOMで同じことを行い、結果ごとにtextContentプロパティを取得することができます。

これより複雑な要件がある場合は、恒等変換でXSLを使用して、好きなほど新しいDOMツリーを生成する方がよい場合があります。例えば、(<p>のような)いくつかの最上位ノードがあり、そのサブノードのすべてではなく一部を除外したい場合(例えば、 "emstrongを保持し、citeを上に収める)、DOMソリューションは

関連する問題