Я пытаюсь получить индекс тега, который href соответствует определенному регулярному выражению, но все, что я пытаюсь, бросает мне предупреждение, в котором говорится, что выражение недействительно. Вот пример.
$dom = new DOMDocument();
$dom->loadHTML($html);
$url_check = testurl.com
$finder = new DomXPath($dom);
$finder->registerNamespace("php", "http://php.net/xpath");
$finder->registerPhpFunctions('preg_match');
//Updated to fix some errors, still invalid expression
$index = $finder->evaluate("count((/ol[@id='rso']/li[not(@id) and @class = 'g' and h3[@class='r']/a[php:function('preg_match','/^(http://|https://|ftp://)?(www(\d+)?.)?($url_check)\/?$/', string(@href) > 0)]])/preceding-sibling::*)");
$html
- это строка, которая хранит html веб-страницы, которая содержит что-то вроде этого
<ol id="wrap">
<li class="list">
<h3 class="j">
<a href="http://xxxxxx.com">Not the one I'm trying to match</a>
</h3>
</li>
.
.
.
<li class="list">
<h3 class="j">
<a href="http://testurl.com">Click here</a>
</h3>
</li>
</ol>
Любое предложение оценивается, и если вы знаете, что лучший/более быстрый способ сделать это, не стесняйтесь делиться :)
Я обнаружил по крайней мере три проблемы в вашем выражении:
preceding-siblings
должны быть единственными, а не множественнымиcount()
не имеет конечной круглой скобки$url_check = testurl.com
не имеет кавычек (должен вызывать синтаксическую ошибку).фиксированный код:
$index = $finder->evaluate("count(/ol[@id='wrap']/li[@class = 'list']/h3[@class='j']/a[php:function('preg_match','/^(http://|https://|ftp://)?(www(\d+)?.)?($url_check)\/?$/', string(@href) > 0)]/preceding-sibling::li[@class='list'])");
Более того, пример html-кода, который вы нам даете, не дает никакого результата для выражения (каждый элемент <a>
не имеет братьев и сестер вообще). Таким образом, даже с этими исправлениями выражение по-прежнему возвращает 0 для вашего тестового примера, что является нормальным