【问题标题】:Parse HTML text then loop through select options' text and value解析 HTML 文本,然后循环选择选项的文本和值
【发布时间】:2026-02-01 16:25:01
【问题描述】:

我正在尝试关联(值->文本)选择元素中的一组选项。我对以下实现的问题是所选值没有与正确的文本相关联:

$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

DEMONSTRATION

我知道一定是因为第一个值是空的,我宁愿保持这个干净并且不做太多逻辑来以正确的方式关联它们。我想还有另一种更直接的方法。

注意:我无法按类获取选择,因为有许多选择具有相同的类并且不确定它们在 HTML 中的位置。

【问题讨论】:

    标签: php html xpath domdocument


    【解决方案1】:

    很难预测 2 个单独的 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";
    }
    
    

    【讨论】:

      【解决方案2】:

      不确定您是否能够执行此操作,但您也可以执行此操作:

      <?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;
      

      【讨论】:

      • 不,你这样做是相反的,我从 html 开始,因此我想要你所谓的 $values