PHP从子节点获取属性('value')

wko9yo5t  于 2023-02-21  发布在  PHP
关注(0)|答案(1)|浏览(105)

我有一个包含多个Select的表单,我想检索<option>元素的getAttribute('value')textContent以构建数组

    • 我有一个代码可以在以下环境下工作:**PHP版本5.6.34、7.2.34、7.4.21
    • 不适用于:**PHP版本7.0.33,7.4.33

我的代码示例:

</form>
<select id="imageextention" name="imageextention" onchange="viewimage('formsig');" class="select">
<option value="blue.gif">sigblue</option>
<option value="green.gif">siggreen</option>
<option value="orange.gif">sigorange</option>
</select>

<select id="fontcolor" name="fontcolor" onchange="viewimage('formsig');">
<option value="#7BCEDE">blue</option>
<option value="#A5B531">green</option>
<option value="#FF8C29">orange</option>
<option value="#F76B7B">pink</option>
<option value="#B584BD">purple</option>
<option value="#FFBD08">yellow</option>
</select>
</form>
$tagname = $doc->getElementById('imageextention')->nodeName;
   if ($tagname == "select") {
      $serials = $doc->getElementById('imageextention')->childNodes;
      $imageextentionM = array();
      foreach ($serials as $n) {
           array_push($imageextentionM[$n->getAttribute('value')] = $n->textContent);
      }
   }

   $tagname2 = $doc->getElementById('fontcolor')->nodeName;
   if ($tagname2 == "select") {
      $serials = $doc->getElementById('fontcolor')->childNodes;
      $fontcolorM = array();
      foreach ($serials as $n) {
         array_push($fontcolorM[$n->getAttribute('value')] = $n->textContent);
      }
      $activecolortxtM="";
   }
}

使用PHP版本7.0.33,7.4.33我有这个错误:
调用未定义的方法DOMText::getAttribute()......堆栈跟踪:#0 {main}已抛出....
它无法识别子元素的getAttribute('value')
我知道我的代码不干净。
我尝试使用getElementsByTagName,但它列出了页面的所有"选项"元素

$num = $doc->getElementById("imageextention")->childNodes->length;
$items = $doc->getElementsByTagName('option');
for ($i=0; $i < $num; $i++) {
   $items = $doc->getElementsByTagName('option');
   $imageextentionM[$items[$i]->getAttribute('value')]= $items[$i]->textContent;
}

提前感谢您的协助。

tp5buhyn

tp5buhyn1#

只是猜测,但您希望在某个地方获得DOMElement对象,但您获得的是DOMText对象,它没有方法getAttribute,最有可能是在->childNodes,它也包含文本节点。因此检查类型将解决错误:

foreach ($serials as $n) {
    if($n instanceof \DOMElement){
        array_push($imageextentionM[$n->getAttribute('value')] = $n->textContent);
    }
    // to investigate which object you got instead:
    /* else { 
        var_dump($n);
    }*/
}

相关问题