如何编写preg_match_all只是为了获取一个特定的元素?

时间:2010-09-30 15:18:05

标签: php preg-match preg-match-all

在网站允许我访问他的API之前,我只需要在这个网站上显示两件事:

What i want to grab // Example on a live page

这两件事包含在div中:

<div style="float: right; margin: 10px;">
here what i want to display on my website
</div>

问题是我在stackoverflow上找到了一个例子,但我之前从未写过preg_match。 如何使用我想要抓取的数据执行此操作?谢谢

<?php   $html = file_get_contents($st_player_cv->getUrlEsl());

preg_match_all(
    'What do i need to write here ?',
    $html,
    $posts, // will contain the data
    PREG_SET_ORDER // formats data into an array of posts
);

foreach ($posts as $post) {
    $premium = $post[1];
    $level = $post[2];

    // do something with data
}

3 个答案:

答案 0 :(得分:3)

DOM的方法是

libxml_use_internal_errors(TRUE);
$dom = new DOMDocument;
$dom->loadHTMLFile('http://www.esl.eu/fr/player/5178309/');
libxml_clear_errors();

$xPath = new DOMXPath($dom);
$nodes = $xPath->query('//div[@style="float: right; margin: 10px;"]');
foreach($nodes as $node) {
    echo $node->nodeValue, PHP_EOL;
}

但是页面中有一大堆JavaScript会在加载页面后严重修改DOM。由于任何基于PHP脚本的提取都不会执行任何JavaScript,因此我们在XPath中搜索的样式尚不存在,我们也不会得到任何结果(Hannes提出的Regex由于同样的原因不起作用)。徽章上的等级编号也不存在。

正如Wrikken在评论中指出的那样,似乎还有一些阻止某些请求的机制。我有一次消息,但我不确定是什么触发它,因为我也可以多次获取页面。

简而言之:你无法达到你想要用这个页面做的事情。

答案 1 :(得分:1)

这个正则表达式'#<div style="float: right; margin: 10px;">(.*)</div>#'应该可以解决问题(是的)但我会建议你使用DOM&amp; XPath的。

编辑:

这是一个Xpath / DOM示例:

$html = <<<HTML
<html>
<body>
    <em>nonsense</em>
    <div style="float: right; margin: 10px;"> here what i want to display on my website </div>
    <div> even more nonsense </div>
</body>
</html>

HTML;

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
$elements = $xpath->query('//div[@style="float: right; margin: 10px;"]');
echo $elements->item(0)->nodeValue;

答案 2 :(得分:1)

如果你想要更通用的东西

  preg_match('/<div[^>]+?>(.*?)<\/div>/', $myhtml, $result);
  echo $result[1] . "\n";

$myhtml包含您必须分析的代码html。 $result是在应用正则表达式后包含正则表达式和()内容的数组。 $result[1]将为您提供<div ... ></div>之间的内容。

这样,即使<div不同(类名更改或属性不同),它仍然有效。