68 lines
2.0 KiB
PHP
68 lines
2.0 KiB
PHP
<?php
|
|
namespace App\Library;
|
|
|
|
use App\Library\ContingentRow;
|
|
|
|
class ContingentParser
|
|
{
|
|
private \DOMXPath $xpath;
|
|
private string $template;
|
|
private const FIELDS = [
|
|
"eduCode" => "td",
|
|
"eduName" => "td",
|
|
"eduLevel" => "td",
|
|
"eduForm" => "td",
|
|
"numberBF" => "th",
|
|
"numberBFF" => "th",
|
|
"numberBR" => "th",
|
|
"numberBRF" => "th",
|
|
"numberBM" => "th",
|
|
"numberBMF" => "th",
|
|
"numberP" => "th",
|
|
"numberPF" => "th",
|
|
"numberAll" => ["th", "td"]
|
|
];
|
|
|
|
public function __construct(string $html, string $template)
|
|
{
|
|
libxml_use_internal_errors(true);
|
|
$dom = new \DOMDocument();
|
|
$dom->loadHTML(mb_convert_encoding($html,'HTML-ENTITIES','UTF-8'));
|
|
$this->xpath = new \DOMXPath($dom);
|
|
$this->template = $template;
|
|
}
|
|
|
|
private function parse(): array
|
|
{
|
|
$data = array();
|
|
foreach (self::FIELDS as $field => $tag) {
|
|
if (!is_array($tag)) {
|
|
$data[$field] = $this->xpath->query($this->template . $tag . "[@itemprop=\"$field\"]");
|
|
} else {
|
|
$th = $this->xpath->query($this->template . $tag[0] . "[@itemprop=\"$field\"]");
|
|
$td = $this->xpath->query($this->template . $tag[1] . "[@itemprop=\"$field\"]");
|
|
$data[$field] = $th > $td ? $th : $td;
|
|
}
|
|
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
public function getDataTable() : array
|
|
{
|
|
$data = $this->parse();
|
|
$records = array();
|
|
|
|
for ($i = 0; $i < $data['eduCode']->length; $i++) {
|
|
$contingentRow = new ContingentRow(
|
|
$data['eduCode']->item($i)->textContent,
|
|
$data['eduName']->item($i)->textContent,
|
|
$data['eduLevel']->item($i)->textContent,
|
|
$data['eduForm']->item($i)->textContent,
|
|
(int)$data['numberAll']->item($i)->textContent
|
|
);
|
|
$records[] = $contingentRow->getData();
|
|
}
|
|
return $records;
|
|
}
|
|
}
|