PHP/XPath: найдите текст node, который "начинается с" конкретной строки?

Мне нужно знать, существует ли конкретная строка в определенном node. Например, мне нужно знать, существует ли "быстрая коричневая лиса", например, в третьем абзаце HTML DOM. Я использую PHP DOMXPath. Любые предложения?

Ответ 1

Попробуйте следующее:

Пример источника:

$html = <<< HTML
<body>
    <p>the dead brown fox</p>
    <p>the slow brown fox</p>
    <p>the quick brown fox</p>
    <p>the crawling brown fox</p>
</body>
HTML;

Код:

$dom = new DOMDocument;
$dom->loadXml($html);
$xp = new DOMXPath($dom);
echo $xp->evaluate('count(/body/p[3][contains(., "quick")])');

XPath переводит на count третий элемент p под элементом body, который contains текст node значение "быстрый". Это вернет 1 или 0, если искомый термин существует где-нибудь в пределах значения node.

Если вам нужно знать, начинается ли значение node с определенной фразой, вместо этого используйте start-with function.

Расширение PHP DOM поддерживает XPath 1.0.

Вы также можете сделать это без XPath через обычный API:

$dom = new DOMDocument;
$dom->loadXml($html);
$thirdPara = $dom->getElementsByTagName('p')->item(2);
echo strpos($thirdPara->nodeValue, 'the quick') === 0 ? 1 : 0;

Метод getElementsByTagName находит, кто бы мог подумать, все элементы по имени тега. Вызов item возвращает третий из этих элементов (с нулевой основанием). Функция strpos находит позицию первого вхождения строки. Результат вышеприведенного фрагмента будет 1 снова (или 0, если значение node не начинается с "быстрого".