正则表达式和xpath查询

时间:2009-08-11 00:00:32

标签: php html regex xpath

我有以下代码

        <?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

此代码查找包含单词“bar”的任何HTML元素,并且它匹配具有“bar”的单词,如“foobar”我想更改查询以仅匹配单词“bar”而没有任何前缀或后缀

我认为可以通过更改查询来搜索在之前或之后没有字母或在之前或之后有空格的每个“条形”来解决这个问题

来自here

的过去问题VolkerK中的此代码

由于

2 个答案:

答案 0 :(得分:2)

您可以使用以下XPath查询

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

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

注意使用“//”会降低速度,XML文件越大。

答案 1 :(得分:2)

如果您正在寻找带有XPath 1.0的“bar”,那么您将不得不使用一组函数,XPath 1.0中没有正则表达式。

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

基本上这就是说找到start-with'bar'或contains'bar'(注意前后空格)或ends-with'bar'的字符串(注意结束 - 是一个XPath 2.0函数,所以我替换了以前的Stackoverflow Answer模拟该函数的代码。)

如果包含'条形'是不够的,因为您可能有"one bar, over""This bar. That bar."'bar'之后可能有其他标点符号。您可以尝试使用此contains

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

'.,[]'翻译为' '(单个空格)...因此"one bar, over"变为"one bar over",因此会按预期匹配" bar "。< / p>