Получить элемент HTML по значению атрибута в php

Мне нужно извлечь некоторые данные с веб-страницы с помощью php. Часть, которая меня интересует, структурирована аналогично этому:

<a href="somepath" target="fruit">apple</a>
<a href="somepath" target="animal">cat</a>
<a href="somepath" target="fruit">orange</a>
<a href="somepath" target="animal">dog</a>
<a href="somepath" target="fruit">mango</a>
<a href="somepath" target="animal">monkey</a>

Во-первых, я хочу извлечь все плоды, а затем всех животных, чтобы у меня их было хорошо сгруппировано.

Я выяснил, как перебирать все значения атрибутов. Здесь код:

$dom = new DOMDocument();
$html = file_get_contents('example.html');

@$dom->loadHTML($html);

$a = $dom->getElementsByTagName('a');

for ($i; $i < $a->length; $i++) {
$attr = $a->item($i)->getAttribute('target');

echo $attr . "\n";
}

Итак, я получаю:

fruit animal fruit animal fruit animal

Я также узнал, как получить текстовое содержимое элементов:

$a->item($i)->textContent

Итак, если включен в цикл и эхо, я получаю:

apple cat orange dog mango monkey

Я чувствую, что я очень близко, но я не могу получить то, что хочу. Мне нужно что-то вроде этого:

if (target = "fruit" ), тогда дайте мне "яблоко, апельсин, манго".

Кто-нибудь может указать мне в правильном направлении?

Спасибо.

Ответ 1

Просто continue на target атрибутах, которые не являются fruit, а затем добавьте textContent элементов в массив.

$nodes = array();

for ($i; $i < $a->length; $i++) {
    $attr = $a->item($i)->getAttribute('target');

    if ($attr != 'fruit') {
        continue;
    }

    $nodes[] = $a->item($i)->textContent;
}

$nodes теперь содержит все узлы элементов, для которых атрибут target установлен в fruit.

Ответ 2

используйте DOMXPath и запросы:

$doc = new DOMDocument();
$doc->Load('yourFile.html');

$xpath = new DOMXPath($doc);

$fruits = $xpath->query("//a[@target='fruit']");
foreach($fruits as $fruit) {
    // ...
}

$animals = $xpath->query("//a[@target='animal']");
foreach($animals as $animal) {
    // ...
}

См. эту демонстрацию.

Ответ 3

Сделайте два массива

$fruits=array();
$animals=array();

т и в цикле, когда вы получите.

if(target=='fruit') {
   array_push($fruits,$valueofelement);

} else if ($target=='animal') {
   array_push($animals,$valueofelement);
}