2009-08-11 10 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 

このコードは、単語「バー」が含まれ、それが「bar」を持つ言葉と一致する任意のHTML要素を見つけるを持っています"foobar"のようにプレフィックスや接尾辞を付けずに "bar"という単語だけを照合するようにクエリを変更したい

私はそれを解決するには、 VolkerKによって過去の質問hereからこのコードを後や前に手紙を受け取りましたか

後、または前にスペースがありません

おかげ

+0

リファレンス:[PHPでxpathの属性をフィルタリングするためにregexを使用する](http://stackoverflow.com/q/6823032/367456)(2011年7月)、 – hakre

答えて

2

次のXPathクエリ

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

を使用することができますまたは

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

メモ "/ /"を使用すると、XMLファイルが大きくなると処理が遅くなります。

+0

これはうまくいかないが、 "bar"という言葉もタイトルに入っているので "strong"と "title"を印刷する必要があります – ahmed

+0

"bar"にマッチさせたいと思ったので、 "bar"または "this bar今 ""しかし、 "今のこのfoobar"ではない*。 – null

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)) 
       ]"); 

は、基本的にこれは、で終わるの通知は、XPath 2.0の機能である(文字列start-with「バー」やcontains「バー」(前と後のスペースに注意してください)またはends-with「バー」を見つけると言ったので、私れます以前Stackoverflow Answerからその機能をエミュレートするコードを置換。)

あなたは'bar'後に他の句読点を有していても良い"one bar, over"または"This bar. That bar."を持っている可能性があるため、「バー」は、十分ではありませんが含まれている場合。 、

' '(単一のスペース)に任意の '.,[]'を変換
contains(translate(., '.,[]', ' '), ' bar ') or 

は...そう"one bar, over""one bar over"なると予想通りこれ" bar "にマッチします:あなたは、代わりにこのcontains試みることができます。