Делаю парсер информации с одного сайта. Нужную информацию спарсил, но теперь не могу разбить эту информацию на элементы в массиве.
Кусок кода, который спарсил:
<div id="score-data">
<h4>АВСТРАЛИЯ И ОКЕАНИЯ</h4>
<span>19:00</span>
Бангладеш - Таиланд
<a href="/match/CIzqg8pj/" class="sched">1:2</a>
<br>
<span>19:00</span>
Восточный Тимо - ОАЭ
<a href="/match/xI35TlM2/" class="sched">1:1</a>
<br>
<span>19:00</span>
Пакистан - Япония
<a href="/match/j9ZnhSad/" class="sched">1:8</a>
<br>
<h4>Кубок Венесуэлы</h4>
<span>15:00</span>
Каракас - Трухильяно
<a href="/match/vZaLKcfM/" class="sched">3:1</a>
<br>
<span>18:30</span>
Португеза - Эстудиантес
<a href="/match/YeaPJH9S/" class="sched">2:2</a>
</div>
По итогу из этого куска нужно сделать вот такой массив:
$array = [
['championship' => 'АВСТРАЛИЯ И ОКЕАНИЯ', 'teams' => 'Бангладеш - Таиланд', 'result' => '1:2'],
['championship' => 'АВСТРАЛИЯ И ОКЕАНИЯ', 'teams' => 'Восточный Тимо - ОАЭ', 'result' => '1:1'],
['championship' => 'АВСТРАЛИЯ И ОКЕАНИЯ', 'teams' => 'Пакистан - Япония', 'result' => '1:8'],
['championship' => 'Кубок Венесуэлы', 'teams' => 'Каракас - Трухильяно', 'result' => '3:1'],
['championship' => 'Кубок Венесуэлы', 'teams' => 'Португеза - Эстудиантес', 'result' => '2:2'],
];
Пожалуйста, подскажите как реализовать идею? Знаю что нужно делать через регулярки, но не понимаю как.
p.s. Дико извиняюсь, вопрос отредактировал, неконкретно указал необходимый результат.
Повозился часик, но сделал, все работает, слегка велосипед, но все же работает, хд.
Само решение включает в себя использование регулярных выражений, хотя изначально хотел использовать библиотеку DOM
для парсинга, но появились некоторые проблемы.
Изначально имеем такие входные данные:
$string = '<div id="score-data">
<h4>АВСТРАЛИЯ И ОКЕАНИЯ</h4>
<span>19:00</span>
Бангладеш - Таиланд
<a href="/match/CIzqg8pj/" class="sched">1:2</a>
<br>
<span>19:00</span>
Восточный Тимо - ОАЭ
<a href="/match/xI35TlM2/" class="sched">1:1</a>
<br>
<span>19:00</span>
Пакистан - Япония
<a href="/match/j9ZnhSad/" class="sched">1:8</a>
<br>
<h4>Кубок Венесуэлы</h4>
<span>15:00</span>
Каракас - Трухильяно
<a href="/match/vZaLKcfM/" class="sched">3:1</a>
<br>
<span>18:30</span>
Португеза - Эстудиантес
<a href="/match/YeaPJH9S/" class="sched">2:2</a>
</div>';
Далее идет само решение, которое я подкорректировал с момента отправления ответа:
preg_match_all('~<div id="score-data">(.+)</div>~s', $string, $matches);
preg_match_all('~<h4>(.+?)</h4>~', $matches[1][0], $match);
$data = array_filter(preg_split('~<h4>(.+?)</h4>~', $matches[1][0]), 'trim');
foreach ($data as $G => $K)
{
preg_match_all('~<span>([^<]+)</span>([^<]+)<a[^>]+>([^<]+)~',
$data[$G], $pregs, PREG_SET_ORDER);
$flix[] = $pregs;
}
foreach ($flix as $c => $keys) {
$cont[$match[1][$c]] = $keys;
}
foreach ($cont as $key => $value)
{
$dataContent[] = array_map(function ($x) use ($key) {
return [
'championship' => $key,
'teams' => trim($x[2]),
'time' => $x[1],
'result' => $x[3]
];
}, $cont[$key]);
}
foreach ($dataContent as $key => $value) {
foreach ($value as $x) {
$array[] = $x;
}
}
print_r($array);
Получаем нужный нам результат:
Array
(
[0] => Array
(
[championship] => АВСТРАЛИЯ И ОКЕАНИЯ
[teams] => Бангладеш - Таиланд
[time] => 19:00
[result] => 1:2
)
...
[4] => Array
(
[championship] => Кубок Венесуэлы
[teams] => Португеза - Эстудиантес
[time] => 18:30
[result] => 2:2
)
)
Я так же добавил в решение переменную time
, на всякий случай, мало ли понадобится.
Важно: я не уверен, что мое решение самое оптимальное, и все еще
склонен к тому, чтобы реализовать это с помощью библиотеки DOM
.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть две таблицы GridViewС первой таблицей, где данные приходят c помощью ajax не работает редактируемая колонка kartik\grid\EditableColumn, Со второй таблицей,...
Вот код, проверяющий файл на превышение допустимого размера
Отправляет несколько сообщений через время на один запрос, хотя OK я прописал:
Суть проблемы в том, что я пытаюсь записать в таблицу данные где u_id равен данному из поста, но мне пишет такую ошибку: