Использование регулярных выражений с xpath в PHP [duplicate]

0

Я пытаюсь использовать xpath для получения значений узла xml, которые соответствуют определенному шаблону (все, что имеет шаблон YYYY/MM/DD). В приведенном ниже примере я хотел бы только найти второй элемент. Я пробовал использовать fn: matches и php: functionString с preg_match, но безрезультатно.

<sometag>
  <link>site:www.mysite.com/2014/</link>
</sometag>
<sometag>
  <link>site:www.mysite.com/2014/01/07</link>
</sometag>

Я думал, что я на правильном пути здесь, но неожиданное удивление, это не сработало.

$regex = '~(0[1-9]|1[012])[- /.](19|20)\d\d[- /.](0[1-9]|[12][0-9]|3[01])~';
$results = $xml->xpath("//link[php:functionString('preg_match', '".$regex."', .)]");

Я пробовал искать только "2013", используя fn: matches, это тоже не сработало.

$results = $xml->xpath("//link[fn:matches('2013')]");

Что я делаю не так?

  • 0
    Имейте в виду , DOMXPath поддерживает только XPath 1,0, для второй попытки, вы можете использовать contains вместо matches
Теги:
xpath

1 ответ

0

Я считаю, что вы хотите отфильтровать DOMNodeList соответствии с возвращаемым значением preg_match. Вот как это сделать:

    $xpath = new DOMXpath($doc);
    $xpath->registerNamespace('php', 'http://php.net/xpath');
    $xpath->registerPhpFunctions();

    $list = $xpath->query("//sometag[1 = php:function('preg_match',
                '/07/', string(link))]");

    foreach ($list as $node) {
        echo $node->nodeValue;
    }

В вышеперечисленном значении $doc ссылается на экземпляр DOMDocument.

Я использую тот факт, что preg_match возвращает 1, если совпадение найдено и 0, если нет.

Примечание. Этот фрагмент предназначен как отправная точка, а не окончательное решение.

Ещё вопросы

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