Разбор HTML-текста, затем просмотр цикла выбора текста и значения - PullRequest
1 голос
/ 26 сентября 2019

Я пытаюсь связать (значение-> текст) группу параметров в элементе выбора.Моя проблема с реализацией ниже состоит в том, что выбранное значение не связывается с правильным текстом:

$html = '<select class="general class" 
    data-url="/foo/bar/">
    <option value=""></option>
    <option Selected value="Bar 1">Foo 1</option>
    <option  value="Bar 2">Foo 2</option>
    <option  value="Bar 3">Foo 3</option>
    <option  value="Bar 4">Foo 4</option>
    <option  value="Bar 5">Foo 5</option>
    <option  value="Bar 6">Foo 6</option>
    <option  value="Bar 7">Foo 7</option>
</select>';

$dom = new \DomDocument('1.0', 'UTF-8');
libxml_use_internal_errors(true);   
$dom->loadHTML($html);

$xp = new \DOMXpath($dom);
$opts_txt = $xp->query('//select[@data-url="/foo/bar/"]/option/text()');
$opts_vals = $xp->query('//select[@data-url="/foo/bar/"]/option/@value');

foreach ($opts_txt as $key => $opt) {
    echo $opt->nodeValue. "\n";
    echo $opts_vals->item($key)->nodeValue. "\n\n";
}

Вывод:

Foo 1


Foo 2
Bar 1

Foo 3
Bar 2

Foo 4
Bar 3

Foo 5
Bar 4

Foo 6
Bar 5

Foo 7
Bar 6

ДЕМОНСТРАЦИЯ

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

Примечание: я не могу захватить выборку по классу, потому что есть много выборок с одним и тем же классом и не уверен насчет их позиции в HTML.

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Трудно предсказать поведение двух отдельных запросов XPath.Проще зациклить верхний уровень в 1 запросе XPath, а затем получить доступ к атрибуту / текстовому содержимому с помощью цикла.

<?php

$html = '<select class="general class" 
    data-url="/foo/bar/">
    <option value=""></option>
    <option Selected value="Bar 1">Foo 1</option>
    <option  value="Bar 2">Foo 2</option>
    <option  value="Bar 3">Foo 3</option>
    <option  value="Bar 4">Foo 4</option>
    <option  value="Bar 5">Foo 5</option>
    <option  value="Bar 6">Foo 6</option>
    <option  value="Bar 7">Foo 7</option>
</select>';

$dom = new \DomDocument('1.0', 'UTF-8');
libxml_use_internal_errors(true);   
$dom->loadHTML($html);

$xp = new \DOMXpath($dom);

$xp->query('//select[@data-url="/foo/bar/"]/option');
foreach ($opts as $opt) {
  var_dump($opt->getAttribute('value'));
  var_dump($opt->textContent);
  echo "\n";
}

0 голосов
/ 26 сентября 2019

Не уверен, что вы можете выполнить это, но вы также можете сделать это:

<?php

$values = [
    '' => '',
    'Bar 1' => 'Foo 1',
    'Bar 2' => 'Bar 2',
    'Bar 3' => 'Bar 3'
];

$html = '';
$html .= '<select class="general class" data-url="/foo/bar/">';
foreach($values as $key => $value) {
    $selected = ($key == 'Bar 1') ? 'selected' : '';
    $html .= '<option value="'.$value.'" '.$selected.'>'.$key.'</option>';
}
$html .= '</select>';

echo $html;
...