Я использую функции xPath PHP DOMDocument.
Допустим, у меня есть HTML-код ниже (чтобы проиллюстрировать мою проблему):
<span class="price">$5.000,00</span>
<span class="newPrice">$4.000,00</span>
Первая строка всегда доступна, но в некоторых случаях ‘newPrice-class’ находится в HTML.
Я использовал это xPath-выражение, но оно всегда возвращает «ценовой класс», даже когда другое присутствует. Когда присутствует класс newPrice, я хочу только это значение. Если его нет, то я хочу значение класса «цена».
//span[@class='price'] | //[span[@class='newPrice']
Как мне этого добиться? Есть идеи?
Возможно, это поможет сформулировать условие по-другому:
Вы хотите выбрать <span>
элемент с class="price"
только если нет ни одного с class="newPrice"
, Иначе ты хочешь тот с class="newPrice"
,
//span[(not(//span[@class="newPrice"]) and @class="price") or @class="newPrice"]
Это выражение Xpath вернет искомый элемент.
Объяснение: Первое условие может быть записано в предикате следующим образом:
not(//span[@class="newPrice"]) and @class="price"
Второе условие, как будто у вас уже было:
@class="newPrice"
С правильной скобкой вы можете объединить это с or
оператор:
//span[
(
not(//span[@class="newPrice"])
and @class="price")
or
@class="newPrice"]
И так как вы хотите получить значения цены в виде строки, это выглядит так в примере кода PHP:
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$expression = 'string(//span[(not(//span[@class="newPrice"]) and @class="price") or @class="newPrice"])';
echo "your price: ", $xpath->evaluate($expression), "\n";
Выход:
your price: $4.000,00
Других решений пока нет …