2017-02-09 7 views
0

Ich möchte die Nummer zurück, die zwischen span HTML-Tags ist. Die Anzahl kann sich ändern!Schwierigkeiten mit der Funktion preg_match_all

<span class="topic-count"> 
    ::before 
    " 
      24 
      " 
    ::after 
</span> 

Ich habe den folgenden Code versucht:

preg_match_all("#<span class=\"topic-count\">(.*?)</span>#", $source, $nombre[$i]); 

Aber es funktioniert nicht.

Entire Code:

$result=array(); 
$page = 201; 
while ($page>=1) { 
    $source = file_get_contents ("http://www.jeuxvideo.com/forums/0-27047-0-1-0-".$page."-0-counter-strike-global-offensive.htm"); 
    preg_match_all("#<span class=\"topic-count\">(.*?)</span>#", $source, $nombre[$i]); 
    $result = array_merge($result, $nombre[$i][1]); 
    print("Page : ".$page ."\n"); 
    $page-=25; 
} 
print_r ($nombre); 
+3

KEINE REGEX FÜR HTML-PARSING VERWENDEN! Zuerst erhalten Sie Ihren Span-Wert, dann verwenden Sie Regex darauf ...! – Random

+0

Fügen Sie den Modifikator s hinzu, damit der Punkt auch mit Zeilenumbrüchen übereinstimmt. Edit: +1 was Random gesagt hat. ;) – Connum

+1

Auch, wenn Sie nur eine Anzahl Übereinstimmung für \ d + – Gordon

Antwort

1

Kann tun mit

preg_match_all(
    '#<span class="topic-count">[^\d]*(\d+)[^\d]*?</span>#s', 
    $html, 
    $matches 
); 

, die alle Stellen vor dem Ende der Spanne erfassen würde.

Beachten Sie jedoch, dass diese Regex nur für genau dieses Stück HTML funktioniert. Wenn das Markup geringfügig variiert, beispielsweise eine andere Klasse oder ein anderes Attribut, funktioniert das Muster nicht mehr. Zuverlässige Regexes für HTML zu schreiben ist schwer.

Daher wird stattdessen die Empfehlung zu use a DOM parser, z.B.

libxml_use_internal_errors(true); 
$dom = new DOMDocument; 
$dom->loadHTMLFile('http://www.jeuxvideo.com/forums/0-27047-0-1-0-1-0-counter-strike-global-offensive.htm'); 
libxml_use_internal_errors(false); 

$xpath = new DOMXPath($dom); 
foreach ($xpath->evaluate('//span[contains(@class, "topic-count")]') as $node) { 
    if (preg_match_all('#\d+#s', $node->nodeValue, $topics)) { 
     echo $topics[0][0], PHP_EOL; 
    } 
} 

DOM will parse the entire page into a tree of nodes, die Sie dann bequem über XPath abfragen können. Beachten Sie den Ausdruck

//span[contains(@class, "topic-count")] 

, die Sie alle Spannweite Elemente mit einer Klasse-Attribut gibt die Zeichenfolge Thema Zählung enthält. Dann, wenn einer dieser Knoten eine Ziffer enthält, echo es.

+0

Danke, es funktioniert perfekt. Ich werde versuchen, den DOM-Parser zu benutzen! Und @Gordon können Sie mir sagen, was [^ \ d] * bedeutet/tun? – Diamonds

+0

@Diamonds [] zeigt eine Zeichengruppe an. Es bedeutet, alles in der Gruppe zu finden. A^am Anfang bedeutet, dass die Gruppe negiert wird, also passen Sie nichts innerhalb der Gruppe an, also [^ \ d] * bedeutet, dass keine Ziffern übereinstimmen. Siehe 'https://regexper.com/#%5B%5E%5Cd%5D* (% 5Cd% 2B)% 5B% 5E% 5Cd% 5D *% 3F'. Beachten Sie auch https://regexone.com – Gordon

+0

Danke, sehr hilfreiche Tools! – Diamonds