2009-08-11 109 views
2

我有以下代碼正則表達式和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 

這個代碼查找包含單詞「酒吧」的任何HTML元素和它匹配的是有「巴」字像「foobar」我想改變查詢,只匹配單詞「酒吧」沒有任何前綴或後綴

我認爲這可以通過更改查詢搜索每個「酒吧」沒有拿到書後,或前或後或之前

這個代碼從過去的問題here通過VolkerK

感謝

+0

參考:[使用正則表達式在xpath中使用php過濾屬性](http://stackoverflow.com/q/6823032/367456)(2011年7月), – hakre 2015-08-17 05:32:44

回答

2

可以使用具有空間下面的XPath查詢

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

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

注意使用「//」會減慢速度,XML文件越大。

+0

謝謝,但這不起作用,它會打印:「strong」雖然它應該打印「強」和「標題」,因爲單詞「酒吧」也在標題中 – ahmed 2009-08-12 02:05:38

+0

我以爲你只是想匹配只是「酒吧」,現在我看到你想要它匹配「酒吧」或「這個酒吧現在「,但*不*現在這個foobar」。 – null 2009-08-12 17:23:56

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「酒吧」或contains「酒吧」(注意之前和之後的空格)或ends-with「巴」(注意,結束-與是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 "