1

スクレイプしてローカルXMLファイルに変換するか、MySQLDBに追加する外部HTMLソースがあります。

外部ソースはほとんど正規化されており、(ある程度)セマンティックであるため、すべてのコンテンツまたはすべてのコンテンツなどXPATHを取得するために使用するだけです。問題は、これらのアイテムがまたはタグを使用して必要な要素のスタイルを設定することです。tdli<strong><b><i>

重要なのは特定のテキストに重点を置くことであり、開発者はブラウザのデフォルトではないCSSを使用したい場合があるため、これは技術的に意味論的です。

問題は、私が取得しようとしている実際のコンテンツがこのインライン要素の子と見なされるため、PHP拡張機能がsimplexmlまたはDOMDocumentDOMNodeそのように扱うことです。例えば:

<table>
<tr><td>Thing 1</td><td>Thing 2</td></tr>
<tr><td>Thing 3</td><td>Thing 4</td></tr>
<tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr>
</table>

結果は次のようになります。

 [table] =>
    [tr] =>
        [td] => Thing 1
        [td] => Thing 2
    [tr] =>
        [td] => Thing 3
        [td] => Thing 4
    [tr] =>
        [td] => 
            [strong] => Thing 5
        [td] => 
            [strong] => Thing 6

明らかに、上記はsimplexmlが返すものではありませんが、上記は一般的な問題を反映しています。

DOMDocumentにすでに組み込まれているパラメーターを使用するか、非常に洗練されたXPathクエリを使用して、td子(存在する場合)から子孫のステータスを取り除き、すべてのコンテンツをのテキストとして処理する要素のコンテンツを取得する方法はありますか?照会された要素?

今のところ、私が持っている唯一の解決策は次のいずれかです。

a)foreach次のように各結果をチェックするループがあります。

$result_text = ($result -> strong) ? $result - strong : $result;

b)regexを使用し<strong>て、HTML文字列からタグを削除してから、simplexmlやDOMDocumentなどのビルド済みクラスにインポートします。

4

3 に答える 3

1

娯楽目的のためだけであれば、正規表現を使用してhtmlを解析する前に、これに対する最初の回答をお読みください。XPathが答えです。解析を続けるのではなく、tdのテキストを取得してください。したがって、次のようなものを検索して//td、その結果を完全に取得します(ツリーの構築を続行して、強いなどと言う葉を作成するのではありません。

于 2010-01-17T08:19:42.530 に答える
1

strip_tags()を使用して余分なマークアップを削除することはできませんか?

$table = simplexml_load_string(
    '<table>
        <tr><td>Thing 1</td><td>Thing 2</td></tr>
        <tr><td>Thing 3</td><td>Thing 4</td></tr>
        <tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr>
    </table>'
);

foreach ($table->xpath('//td') as $td)
{
    $content = strip_tags($td->asXML());
    echo $content, "\n";
}
于 2010-01-17T08:20:15.497 に答える
0

DOMDocumentを使用している場合、DOMNodeを選択すると、プロパティtextContentにはそのテキスト部分とその子孫すべてが含まれる必要があります...まさにあなたが要求したものです。

$table = '<table>
        <tr><td>Thing 1</td><td>Thing 2</td></tr>
        <tr><td>Thing 3</td><td>Thing 4</td></tr>
        <tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr>
    </table>';

$dom = new DOMDocument;
$dom->loadHTML($table);
$xpath = new DOMXPath($dom);

$els = $xpath->query('//td');
echo $els->item(4)->textContent; //Thing 5

または、ノードの種類によっては、確認することもできnodeValueます。違いを正確に思い出せませんが、textContentはあなたが望むものです。

于 2010-01-17T09:22:02.500 に答える