XPath / PHP - возвращает индекс определенного тега, который соответствует регулярному выражению

0

Я пытаюсь получить индекс тега, который 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>

Любое предложение оценивается, и если вы знаете, что лучший/более быстрый способ сделать это, не стесняйтесь делиться :)

Теги:
xpath

1 ответ

0

Я обнаружил по крайней мере три проблемы в вашем выражении:

  • 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 для вашего тестового примера, что является нормальным

  • 0
    Кавычки $ url_check в моем реальном коде, это пример. То, что я пытаюсь достичь, - это подсчет предыдущих братьев и сестер в li, которые содержат тег с атрибутом href, который удовлетворяет. Это первый раз, когда я работаю с XPath, поэтому мне сложно разобраться с синтаксисом

Ещё вопросы

Сообщество Overcoder
Наверх
Меню