Как написать preg_match_all только для захвата одного конкретного элемента? - PullRequest
1 голос
/ 30 сентября 2010

Пока сайт не даст мне доступ к его API, мне нужно отобразить только 2 вещи с этого сайта:

Что я хочу захватить // Пример на живой странице

Эти две вещи содержатся в 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 ]

3 голосов
/ 30 сентября 2010

Способ 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, еще не существует, и мы не получим никаких результатов (Regex, предложенный Hannes, не работает по той же причине).Также не существует номеров уровней на значке.

Как указал Виккен в комментариях, также, похоже, существует какой-то механизм, блокирующий определенные запросы.У меня было сообщение однажды, но я не уверен, что его вызывает, потому что я также мог несколько раз получать страницу.

Короче говоря, коротко: вы не можете достичь того, что вы естьпытаюсь сделать с этой страницей.

1 голос
/ 30 сентября 2010

Если вы хотите что-то более общее

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

$myhtml содержит код HTML, который вы должны проанализировать.$result - это массив, содержащий содержимое регулярных выражений и () после применения регулярного выражения.$result[1] даст вам то, что находится между <div ... > и </div>.

Таким образом, даже если <div отличается (изменение имени класса или другие атрибуты), оно все равно будет работать.

1 голос
/ 30 сентября 2010

это регулярное выражение '#<div style="float: right; margin: 10px;">(.*)</div>#' должно сработать (да), но я бы посоветовал вам использовать DOM & XPath.

edit:

Вот пример 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;
...