регулярные выражения и запрос xpath - PullRequest
2 голосов
/ 11 августа 2009

У меня есть следующий код

        <?php
        $doc = new DOMDocument;
        $doc->loadhtml('<html>
                       <head> 
                        <title>bar , this is an example</title> 
                       </head> 
                       <body> 
                       <h1>latest news</h1>
                       foo <strong>bar</strong> 
                      <i>foobar</i>
                       </body>
                       </html>');


        $xpath = new DOMXPath($doc);
        foreach($xpath->query('//*[contains(child::text(),"bar")]') as $e) {
              echo $e->tagName, "\n";
        }

Печать

       title
       strong
       i

этот код находит любой HTML-элемент, содержащий слово «bar», и соответствует словам со словом «bar», например «foobar». Я хочу изменить запрос, чтобы он соответствовал только слову «bar» без префикса или постфикса

Я думаю, что это можно решить, изменив запрос для поиска каждого "бара", у которого нет буквы после или до или с пробелом после или до

этот код из прошлого вопроса здесь от VolkerK

Спасибо

Ответы [ 2 ]

2 голосов
/ 12 августа 2009

Если вы ищете просто «bar» в XPath 1.0, вам придется использовать комбинацию функций, в XPath 1.0 нет регулярных выражений.

$xpath->query("//*[
                starts-with(., 'bar') or 
                contains(., ' bar ') or  
                ('bar' = substring(.,string-length(.)-string-length('bar')+1))
              ]");

В основном это говорит, что найти строки, которые start-with 'бар' или contains 'бар' (обратите внимание на пробелы до и после) или ends-with 'бар' (обратите внимание, что заканчивается XPath 2.0, поэтому я заменил код, который эмулирует эту функцию из предыдущего ответа Stackoverflow .)

, если содержимого 'bar' недостаточно, потому что у вас может быть "one bar, over" или "This bar. That bar.", где у вас могут быть другие знаки препинания после 'bar'. Вы можете попробовать это contains вместо:

contains(translate(., '.,[]', ' '), ' bar ') or

Это переводит любой '.,[]' в ' ' (один пробел) ... так что "one bar, over" становится "one bar over", таким образом, будет соответствовать " bar ", как и ожидалось.

2 голосов
/ 11 августа 2009

Вы можете использовать следующий XPath Query

$xpath->query("//*[text()='bar']");

или

$xpath->query("//*[.='bar']");

Заметьте, что использование "//" замедлит работу, чем больше ваш XML-файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...