2010-06-01 16 views
5

To mycodePHP wyrażenie regularne pasujące do div

<?php 

/** 
* @author Joomlacoders 
* @copyright 2010 
*/ 
    $url="http://urlchecker.net/html/demo.html"; 

    $innerHtml=file_get_contents($url); 

    //echo $innerHtml; 
    preg_match_all("{\<div id='news-id-.*d'\>(.*)\</div\>}",$innerHtml,$matches); 

      //<div id='news-id-160346'>    

    var_dump($matches); 

?> 

chcę znaleźć wszystkie treści w div id = 'news-id-160346'. z wyrażeń regularnych Proszę mi pomóc

Odpowiedz

6

Use an HTML parser. NOT regular expressions.

Problemem jest to, że nie mogą dopasować zagnieżdżone struktury. Zakładając, że wyrażenie regularne musi pasować jeden <div> i jego znacznik zamykający, nie ma sposobu, aby prawidłowo dopasować to wejście:

<div id="a"> 
    <div id="b"> 
     Foo 
    </div> 
</div> 
<div id="c"> 
    Bar 
</div> 

Bo jeśli wyrażenie regularne jest chciwy, to dopasować dwa skrajne div, a jeśli jest to ungreedy , nie będzie pasować do poprawnego tagu końcowego.

Dlatego należy użyć parsera HTML. Z PHP, DOMDocument::loadHTML lub DOMDocument::loadHTMLFile każdy wykonuje całkiem dobrą robotę. (Możesz "bezpiecznie" zignorować ostrzeżenia, które generuje: są to tylko błędy znaczników, a wygenerowany obiekt DOMDocument powinien być prawie w porządku.)

Ponieważ PHP getElementById jest trudny do osiągnięcia, możesz użyć Ścieżka DOMX w tym samym celu:

<?php 

$url = "http://urlchecker.net/html/demo.html"; 

$d = new DOMDocument(); 
$d->loadHTMLFile($url); 

$xpath = new DOMXPath($d); 
$myNews = $xpath->query('//@id="news-id-160346"')->item(0); 

?> 
+0

Witam miałem spróbować wszystkich odpowiedzi, lecz nie uda Warning: DOMDocument :: loadHTMLFile() [domdocument.loadhtmlfile]: Nieoczekiwany tag koniec: a W http://urlchecker.net/html/demo.html wiersz: 26 w /home/urlcheck/public_html/html/test.php na linii 10 – Thoman

+1

@Thoman: w rzeczywistości udało się. loadHTMLFile po prostu informuje o problemach napotkanych podczas analizy. Możesz zamknąć go operatorem '@': '@ $ d-> loadHTMLFile ($ url);' – zneak

+0

Próbuję, ale ten kod nie pasuje do wszystkich treści w id = 'news-id-160346' – Thoman

0

Użyj parsera, jak sugerowali inni.

Lub spróbuj tego regex:

preg_match_all("#<div [^>]*id=['\"]news-id-\\d+['\"](.*?)</div>#", $innerHtml, $matches); 
print_r($matches); 

sprawdzić wyjście z rachunku print_r aby zrozumieć dlaczego regex nie jest uważany za prawą narzędzie dla parsowania HTML.

+0

Nie mecz, napraw to proszę – Thoman

+0

@Thoman Przeczytaj moją ostatnią linię ponownie. Nie pasuje - to jest cały punkt - nie można go naprawić. – Amarghosh

+0

Troszczyć się o wyjaśnienie, dlaczego zostało odrzucone? – Amarghosh

Powiązane problemy