düzenli ifadeler ve XPath sorgu

2 Cevap php

Ben aşağıdaki kodu var

        <?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";
        }

Baskılar

       title
       strong
       i

Bu kod kelime "bar" içeren herhangi bir HTML elemanının bulur ve ben herhangi bir önek veya postfix olmaksızın sadece kelime "bar" eşleştirmek için sorguyu değiştirmek istiyoruz "filanca" gibi "bar" vardır sözcükleri maçlar

Ben önce veya sonra bir mektup aldım ya önce veya sonra bir boşluk var değil her "bar" için arama sorgusunu değiştirerek çözülebileceğini düşünüyorum

Geçmiş soruya here VolkerK tarafından bu kod

Teşekkürler

2 Cevap

Sen şu XPath sveyagusu kullanabilirsiniz

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

veya

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

"/ /" Yavaş olacak şeyler aşağı kullanarak Not, büyük size XML dosyasıdır.

XPath 1.0 ile sadece "bar", o zaman fonksiyonları bir combo kullanmak gerekir arıyorsanız, XPath 1.0 düzenli ifadeler vardır.

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

Temelde bu o start-with 'bar' veya contains 'bar' (önce ve sonra boşluk fark) veya ends-with 'bar' (haber dizeleri bulmak söylediğini Bir XPath 2.0 işlevi ile-biter, bu yüzden bir önceki Stackoverflow Answer o işlevi öykünür kodunu değiştirmiş.)

'bar' içeriyorsa "one bar, over" veya "This bar. That bar." nereye sonra 'bar' başka noktalama işaretleri olabilir olabilir, çünkü, yeterli değildir. Sen contains yerine bu deneyebilirsiniz:

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

Yani herhangi bir '.,[]' bir ' ' (tek boşluk) için ... yani "one bar, over" olur "one bar over", böylece {maç olur [(4 çevirir )]} beklendiği gibi.