Разбить HTML на элементы в массиве

181
03 ноября 2018, 23:00

Делаю парсер информации с одного сайта. Нужную информацию спарсил, но теперь не могу разбить эту информацию на элементы в массиве.

Кусок кода, который спарсил:

<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. Дико извиняюсь, вопрос отредактировал, неконкретно указал необходимый результат.

Answer 1

Повозился часик, но сделал, все работает, слегка велосипед, но все же работает, хд.

Само решение включает в себя использование регулярных выражений, хотя изначально хотел использовать библиотеку 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.

READ ALSO
Не работает редактируемая колонка kartik\grid\EditableColumn, с данными которые приходят ajax запросом

Не работает редактируемая колонка kartik\grid\EditableColumn, с данными которые приходят ajax запросом

Есть две таблицы GridViewС первой таблицей, где данные приходят c помощью ajax не работает редактируемая колонка kartik\grid\EditableColumn, Со второй таблицей,...

146
Нет ответа при загрузке большого фала на сервер

Нет ответа при загрузке большого фала на сервер

Вот код, проверяющий файл на превышение допустимого размера

130
vk callback api: Проблема с получением сообщения

vk callback api: Проблема с получением сообщения

Отправляет несколько сообщений через время на один запрос, хотя OK я прописал:

161
Как исправить ошибку Unknown column &#39;id&#39; in &#39;field list&#39; trace

Как исправить ошибку Unknown column 'id' in 'field list' trace

Суть проблемы в том, что я пытаюсь записать в таблицу данные где u_id равен данному из поста, но мне пишет такую ошибку:

177