Использование регулярного выражения в PHP XPath-> оценить

#php #regex #dom #xpath

#php #регулярное выражение #dom #xpath

Вопрос:

В качестве простого примера я пытаюсь получить все объекты dom, которые содержат адреса электронной почты.

     $doc = new DOMDocument;
    $doc->loadHTML($page);

    $xpath = new DOMXPath($doc);
    $body = $doc->getElementsByTagName('table')->item(0);
    $query = "//text()[fn:matches(., '[wd.-] @[wd.-] .[a-zA-Z]{2,4}')]"; // 
    $entries = $xpath->evaluate($query, $body); // 
    foreach ($entries as $entry) {
        echo "Found {$entry->textContent}<br>n";
    }
  

Я получаю сообщение об ошибке: "DOMXPath::evaluate() [domxpath.evaluate]: xmlXPathCompOpEval: function matches bound to undefined prefix fn ..."

Я также попробовал подход

 //text()[
    php:function('BooleanPregMatch', '[wd.-] @[wd.-] .[a-zA-Z]{2,4}', .)
]
  

безуспешно.

Я не смог найти много примеров, связанных с fn: match или php:function. Любая помощь была бы оценена.

Комментарии:

1. могу ли я предложить попробовать это с двойными кавычками в функции matches()?

2. Вы читали DOMXPath::registerPhpFunctions() страницу ?

Ответ №1:

fn:matches это XPath 2.0, в DOMXPath у вас XPath 1.0. Вот почему он не работает, он не поддерживается.

Примеры для php:function доступны на странице руководства для DOMXPath::registerPhpFunctions . Для регистрации функций у вас должен быть PHP 5.3.