1

XPath クエリが最後の一致しか返さない理由は何ですか? 明らかに複数のタグを持つ HTML フラグメントに対してクエリを実行しています<a name="...">が、XPath クエリは 1 つの要素のみを返します。これはたまたま最後の要素です。

function extract($html) {
    // This test shows that the retrieved HTML fragment indeed contains multiple anchor tags
    echo "<textarea>".$html."</textarea>";

    // parse the data
    $dom = new DomDocument();
    @$dom->loadHTML($html); // we use @$dom to suppress some warnings
    $xpath = new DOMXPath($dom);

    // find the html code for the post
    $query = "//a[contains(@name, 'post')]"; 
    $rows = $xpath->query($query);

    // This will return 1
    echo "Elements found: " . count($rows);

    ...
}
4

1 に答える 1

4

プローブする必要があります$rows->length。その理由は、 ($rowsインスタンスDOMNodeListのリストを保持するオブジェクトDOMNode) のインスタンスだからです。また、DOMNodeListは interface を実装していないため、期待どおりCountableにプローブすることはできませんcount()。集約した s1の量ではなく、単一のオブジェクトであるため、単純に を返します。DOMNode

そのため、クエリの結果は最後の一致のみを返すわけではありません。foreachそれはそれらすべてを返し、次のようにそれらを繰り返すことができます:

foreach( $rows as $row )
{
    // do something with $row (instance of DOMNode)
}

...またはforループを使用して、次のようにします。

for( $i = 0, $len = $rows->length; $i < $len; $i++ )
{
    $row = $rows->item( $i );
    // do something with $row (instance of DOMNode)
}

...など

于 2012-11-24T14:21:08.800 に答える