Я пытаюсь получить текст из ссылок в следующем HEREDOC.
$html = <<<EOT
<a class="details" href="/link.asp">$2,697.75</a>
<a class="details" href="/link.asp"><s>$150.00</s></a>
<a class="details" href="/link.asp"><font color="red" size="2"><b>Price: $125.00</b></font></a>
EOT;
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadhtml($html);
$xpath = new DOMXPath($dom);
$prices_nodeList = $xpath->query('//child::a[@class="details"]');
//$prices_nodeList = $xpath->query('//descendant::a[@class="details"]');
//$prices_nodeList = $xpath->query('//a[@class="details"]/descendant::text()');
foreach ($prices_nodeList as $price) {
$prices[] = $price->nodeValue;
}
echo("prices");
echo("");
print_r($prices);
echo("
");?>
Запрос xpath, назначенный $ values_nodeList
$prices_nodeList = $xpath->query('//child::a[@class="details"]');
, кажется, делает то, что я хочу, но я не думаю, что понимаю, как это работает. Насколько я понимаю, он говорит: «получить все прямые дочерние элементы ссылок с классом« детали »».Однако текст в последних двух ссылках не является прямым потомком, поэтому я не уверен, почему мне не нужно использовать
$prices_nodeList = $xpath->query('//descendant::a[@class="details"]');
This (то есть первое закомментированное значение $ values_nodeList)также извлекает все три значения. Мне интересно, почему они оба работают, и действительно ли мой запрос является лучшим способом сделать это. В отличие от этого
$prices_nodeList = $xpath->query('//a[@class="details"]/descendant::text()');
работает также, но
$prices_nodeList = $xpath->query('//a[@class="details"]/child::text()');
извлекает только первое значение (2 697,75 долл. США), а не последние два (поскольку текст содержится внутри элементов).