2017-02-09 8 views
0

スパンHTMLタグの間の番号を取得したいと思います。番号が変わることがあります!関数の難しさpreg_match_all

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

私は、次のコードを試してみた:

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

をしかし、それは動作しません。

全体コード:

$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

HTMLパーシング用のREGEXは使用しないでください!最初にあなたのスパンの値を取得し、正規表現を使って...! – Random

+0

s修飾子を追加すると、ドットも改行に一致します。編集:ランダムは言った+1。 ;) – Connum

+1

また、\ d + – Gordon

答えて

1

は、スパンの終了前に任意の数字をキャプチャします

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

で行うことができます。

ただし、この正規表現はこのHTML部分のみで動作することに注意してください。別のクラスや別の属性などのマークアップに多少のばらつきがある場合、パターンはもう機能しません。 HTMLの信頼できる正規表現を書くのは難しいです。

したがって、代わりにuse a DOM parserへの推奨。

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これは、XPath経由で便利にクエリできます。

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

これは、文字列topic-countを含むclass属性ですべてのspan要素を与えることに注意してください。次に、これらのノードのいずれかに数字が含まれている場合は、それをエコーし​​ます。

+0

ありがとう、それは完全に動作します。私はDOMパーサーも使用しようとします!そして、@ Gordonは、あなたが何を意味するのかを教えてくれますか? – Diamonds

+0

@Diamonds []は文字グループを示します。それは、グループ内の何かにマッチすることを意味します。最初の^はグループを否定することを意味するので、グループ内のものと一致しないようにしてください。[^ \ d] *は数字と一致しないことを意味します。 「https://regexper.com/#%5B%5E%5Cd%5D*(%5Cd%2B)%5B%5E%5Cd%5D *%3F'」を参照してください。また、https://regexone.comを考慮してください – Gordon

+0

ありがとう、非常に便利なツール! – Diamonds