Nasıl bir HTML belgesinde bir anahtar kelimenin yerini anlamaya?

5 Cevap php

Ben bir dize olarak bir HTML belgesi var

Bu belgede bir anahtar kelime için arama ve nerede belgede görünür yaptım anlamaya istiyorum

Yani görünmesini vermedi hangi tag

H1, H2 veya ADI etiketi ortaya çıktı

Benim belge Diyelim

        $string = "<html>
                   <head> 
                   <title>bar , this is an example</title> 
                   </head> 
                   <body> 
                   <h1>latest news</h1>
                   foo <strong>bar</strong> 
                   </body>
                   </html>";


                   $arr = find_term("bar",$string);
                   print_r($arr);

Ben sonuç böyle olmasını bekliyoruz

                   [0]=> title
                   [1]=> strong

"bar" Güçlü etiketi ADI etiketi ve bir süre içinde bir kez çıktı, çünkü

Ben birisi cevabını bilen varsa ben soruyorum neden olduğunu, karmaşık bir soru biliyordum :)

teşekkürler

ne kadar olduğu var

        function find_term($term,$string){
               $arr = explode($term, $string);
               return $arr;
        }
        $arr = find_term("bar",$string);
        print_r($arr);

şimdi değere sahip bir dizi var

             Array
             (
             [0] => <html>
               <head>
               <title>

             [1] =>  , this is an example</title>
               </head>
               <body>
               <h1>latest news</h1>
               foo <strong>

             [2] => </strong>
               </body>
               </html>
             )

you can see that the last tag of every element of the array is the tag which contains "bar" but the question now is how to know the last tag appeard in every element?

Teşekkürler

5 Cevap

Sen DOMDocument kullanın ve xpath Bunun için olabilir.

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

I-elemanı edin. Bu foobar içeren, tek bir kelime olarak bar ve XPath sorgusuna değil. Bu nedenle, bu çözelti veya yeterli olmayabilir.

Ben bir php programcı değilim, ancak bir html dom çözümleyici ele alabilirsiniz genellikle eğer, bu kolay kılacak. Tüm metin düğümleri bulmak ve metin dizesi için onları arayın. Eğer bir maç var Whenver, sadece üst düğümün adını almak.

Bir dom çözümleyici olmadan başa iki sorun vardır.

  1. XHTML kullandığınız sürece, html xml değildir.
    etrafında kodlamalısınız olacak iyi bir örnektir.

  2. İkincisi, etiketleri aşağıdaki kombinasyonu " bar " olarak kabul edilmesi gerekir. Bu cevap "a" neden, ve "b" veya "c" olmalıdır.

Hatta "bar" dizesi yer ettikten sonra, bu nedenle hemen bir sonraki veya bir önceki etiket bulamıyorum olamaz. Bunun yerine 1 bir sayaç seti ve izleme geri başlamalıdır. Bir başlangıç ​​etiketi karşılaştığınızda, tek azaltmak ve bir bitiş etiketi karşılaşma birer birer artar. Sayaç 0'a düştüğünde, şu anda üzerinde etiketi kaydedin.

Son olarak, " bar " olarak biçimlendirilmiş html de var. Bununla başa çıkmak için iyi bir yol olup olmadığını ben gerçekten bilmiyorum.

i u ilk gerektiğini düşünüyorum,

Ayrıştırma html diziye,

Bu seversin fonksiyonu bulmak: http://www.php.happycodings.com/Arrays/code35.html

ya da sınıf gibi: http://www.phpclasses.org/browse/package/5139.html

döngü bu dizide bu aramadan sonra.

Aşağıdaki kod, çoğu zaman çalışacaktır. Bu HTML yorumlarını saygı ve alıntı dizeleri (örneğin, <img alt="<grin>" ...) ile karışık olabilir ama <i><b>foo</i>bar</b> gibi patolojik durumlarda boğulmamak wont't, ve hatta makul bir sonuç verir.

Bu <?php> gibi etiketleri fark etmez, ve <br> or <input> gibi boş etiketleri hakkında bilmiyor ama </br /> gibi etiketleri yok sayacaktır. Sen boş etiketleri (img, hr, br, giriş, vb) görmezden mantığı ekleyebilirsiniz.

Arama sözcüğü \ b (sözcük sınır) ile çevrilidir yüzden filanca uyumlu değildir.

$html   = "<html>
               <head>
               <title>bar , this is an example</title>
               </head>
               <body class=3>
               <h1>latest news</h1>
               foo <strong>bar</strong> <br />bar
               <i>foobar</i>
               </body>
               </html>";
$search = 'bar';

preg_match_all('/(\<(\/?)(\w+).*?(\/?)\>)|(\b'.$search.'\b)/i', $html, $matches, PREG_SET_ORDER);

$tags = array();
$found = array();
foreach ($matches as $m) {
    if ($m[2] == '/') {
        $n = array_search($m[3], $tags);
        if ($n !== false)
            array_splice($tags, $n, 1);
    }
    else if ($m[3] and !$m[4]) {
        array_unshift($tags, $m[3]);
    }
    else if ($m[5]){
        $found[] = $tags[0];
    }
}
print_r($found);

Bu (<br /> etiketinden sonra ekstra çubuğu ile) verir

Array
(
    [0] => title
    [1] => strong
    [2] => body
)

Hm, bu zor bir soru.

Neden, anahtar kelime için dize arama bunu buldum konumunu hatırlamak, ve sonra ilk "<", gördüğünüz kadar diziye olduğunu yazmak ">" görene kadar geriye dize üzerinden gitmez.