PHP — Извлечение значения ячейки таблицы с выражением соответствия

#php #html

#php #HTML

Вопрос:

Я хочу извлечь значение определенной ячейки из таблицы на веб-странице. Сначала я ищу строку (здесь имя игрока), а после я не хочу получать значение <td> связанной ячейки (здесь 94).

Я могу подключиться к веб-странице, найти таблицу с идентификатором is и получить все значения. Я также могу выполнить поиск в определенной строке, preg_match но я не могу извлечь значение <td> ячейки.

Какой наилучший способ извлечь значение таблицы с выражением соответствия?

Вот мой скрипт :

 <?php

// Connect to the web page
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->strictErrorChecking = false;
$doc->recover = true;
@$doc->loadHTMLFile('https://www.basketball-reference.com/leaders/trp_dbl_career.html');
$xpath = new DOMXPath($doc);

// Extract the table from is id
$table = $xpath->query("//*[@id='nba']")->item(0);

// See result in HTML
//$tableResult = $doc->saveHTML($table);
//print $tableResu<

// Get elements by tags and build a string
$str = "";
$rows = $table->getElementsByTagName("tr");
foreach ($rows as $row) {
  $cells = $row -> getElementsByTagName('td');
  foreach ($cells as $cell) {
    $str .= $cell->nodeValue;
  }
}  

// Search a specific string (here a player's name)
$player = preg_match('/LeBron James(.*)/', $str, $matches);

// Get the value
$playerValue = intval(array_pop($matches));
print $playerValue;

?>
  

Вот HTML структура таблицы :

 <table id="nba">
<thead><tr><th>Rank</th><th>Player</th><th>Trp Dbl</th></tr></thead>
...
<tr>
<td>5.</td>
<td><strong><a href="/players/j/jamesle01.html">LeBron James</a></strong></td>
<td>94</td>
</tr>
...
</table>
  

Ответ №1:

Решение для манипулирования DOM.

Поиск по всем ячейкам и разрыв, если ячейка содержит LeBron James значение.

 $doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->strictErrorChecking = false;
$doc->recover = true;
@$doc->loadHTMLFile('https://www.basketball-reference.com/leaders/trp_dbl_career.html');
$xpath = new DOMXPath($doc);

$table = $xpath->query("//*[@id='nba']")->item(0);

$str = "";
$rows = $table->getElementsByTagName("tr");
$trpDbl = null;
foreach ($rows as $row) {
    $cells = $row->getElementsByTagName('td');
    foreach ($cells as $cell) {
        if (preg_match('/LeBron James/', $cell->nodeValue, $matches)) {
            $trpDbl = $cell->nextSibling->nodeValue;
            break;
        }
    }
}

print($trpDbl);
  

Регулярное выражение для всего значения ячейки с именем LeBron James .

 $player = preg_match('/<td>(.*LeBron James.*)</td>/', $str, $matches);
  

Если вы хотите также получить идентификатор 94 из следующей ячейки, вы можете использовать это выражение.

 $player = preg_match('/<td>(.*LeBron James.*)</td>s*<td>(.*)</td>/', $str, $matches);
  

Он возвращает две группы, первая ячейка с именем игрока, а вторая с идентификатором.

Комментарии:

1. Эти оба выражения регулярных выражений возвращают мне пустой массив, например, если они не совпадают. Я что-то упускаю?

2. Вы должны использовать его для всего HTML-кода. Вам нужно решение для регулярных выражений или решение для манипулирования DOM (XML)?