Как спарсить определенную ячейку HTML-таблицы и несколько последующих?

Здравствуйте.

Застрял на следующей проблеме. Есть HTML-таблица:
<table>
 <tr>
   <td class="past">текст</td>
   <td class="past">текст</td>
   <td class="past">текст</td>
   ..........................
   <td class="today">текст</td>
   <td>текст</td>
   <td>текст</td>
 </tr>
 <tr>
   <td>текст</td>
   <td class="weekend">текст</td>
   <td class="weekend">текст</td>
   <td>текст</td>
   <td>текст</td>
   <td>текст</td>
 </tr>
</table>

Стоит задача при помощи регулярных выражений спарсить все содержимое ячейки <td class="today"> и вдобавок содержимое еще 4-х следующих сразу за ней ячеек. Причем, независимо от того, имеют эти ячейки класс или нет, и расположены они в текущей строке <tr> или в следующей.

Если с написанием регулярки конкретно для ячейки <td class="today"> проблем не должно возникнуть, то как включить в парсинг эти соседние ячейки - пока не могу придумать.

Буду рад любой помощи. Спасибо.
  • Вопрос задан
  • 3399 просмотров
Решения вопроса 1
@anndmill Автор вопроса
По совету 'AlexP11223' и погуглив, накидал такой код.
Чувствую, что он далеко не идеален, но все работает.
Замечания принимаются.)

libxml_use_internal_errors(true);
$dom = new DomDocument;
$dom->loadHTMLFile("http://calendar.zoznam.sk/sunset-pl.php?city=3080866");
$xpath = new DomXPath($dom);

$today = $xpath->query("//td[@class='today']");
$nodes1 = $xpath->query("//td[@class='today']/following::td[1]");
$nodes2 = $xpath->query("//td[@class='today']/following::td[2]");
$nodes3 = $xpath->query("//td[@class='today']/following::td[3]");
$nodes4 = $xpath->query("//td[@class='today']/following::td[4]");

header("Content-type: text/plain");

foreach ($today as $i => $node) {
    echo $node->nodeValue, "\n";
}
foreach ($nodes1 as $i => $node1) {
    echo $node1->nodeValue, "\n";
}
foreach ($nodes2 as $i => $node2) {
    echo $node2->nodeValue, "\n";
}
foreach ($nodes3 as $i => $node3) {
    echo $node3->nodeValue, "\n";
}
foreach ($nodes4 as $i => $node4) {
    echo $node4->nodeValue, "\n";
}


+ Если с evaluate, то будет примерно так:

$today = $xpath->evaluate('string(//td[@class="today"])');
$first = $xpath->evaluate('string(//td[@class="today"]/following::td[1])');
$second = $xpath->evaluate('string(//td[@class="today"]/following::td[2])');
$third = $xpath->evaluate('string(//td[@class="today"]/following::td[3])');
$fourth = $xpath->evaluate('string(//td[@class="today"]/following::td[4])');
	
echo 	$today."<br>",
		$first."<br>",
		$second."<br>",
		$third."<br>",
		$fourth;
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AlexP11223
Зачем парсить рег. выражениями HTML?
stackoverflow.com/a/1732454/964478
Есть же например XPath.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
03 мая 2024, в 18:59
2500 руб./за проект
03 мая 2024, в 18:52
15000 руб./за проект