PHP DOM 获取被选中的<option>标签

4

假设HTML代码如下:

<select name="some_name">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3" selected="selected">3</option>
    <option value="4">4</option>
</select>

我需要从中提取带有属性selected="selected"的选项标签。我该怎么做?到目前为止,我有以下内容:
$string = file_get_contents('test.html');

include 'htmlpurifier-4.0.0-standalone/HTMLPurifier.standalone.php';
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Doctype', 'XHTML 1.0 Strict');
$purifier = new HTMLPurifier($config);
$string = $purifier->purify($string);

$dom = new DOMDocument();
$dom->loadHTML('<?xml encoding="UTF-8">' . $string);
$dom->preserveWhiteSpace = false;

$num = 0;

$optionTags = $dom->getElementsByTagName('option');
foreach ($optionTags as $o) {
    if ($o->hasAttribute('selected')
        && 'selected' === $o->getAttribute('selected')) {
        $num = $o->nodeValue;
    }
}

echo $num;

但这并不起作用。$num之后仍然等于零。

5个回答

7
我认为它不起作用是因为您忘记使用其属性“item”访问“DOMNodeList”的项目。
尝试这种方法,循环遍历返回的整个DOMNodeList长度。检查当前项目索引处的DOMNode是否具有名为“selected”的属性。
$num = 0;
$optionTags = $dom->getElementsByTagName('option');
for ($i = 0; $i < $optionTags->length; $i++ ) {
 if ($optionTags->item($i)->hasAttribute('selected') 
           && $optionTags->item($i)->getAttribute('selected') === "selected") {
     $num = $optionTags->item($i)->nodeValue;
 }
}

编辑:

我的代码如下:

$dom = new DOMDocument();
$dom->load("C:\\test.htm");
$num = 0;
$optionTags = $dom->getElementsByTagName('option');
for ($i = 0; $i < $optionTags->length; $i++ ) {
  if ($optionTags->item($i)->hasAttribute('selected') 
         && $optionTags->item($i)->getAttribute('selected') === "selected") {
       $num = $optionTags->item($i)->nodeValue;
  }
}
echo "Num is " . $num;

输出:

Num 是 3


尝试使用==而不是===,看看是否有效,如果不行,我会运行测试并尝试让它工作。 - Anthony Forloney
我尝试过了,仍然没有任何结果。顺便说一下,确切的HTML来自于这个页面:http://www.futbalvsfz.sk/sutaze/sezona-2009-2010/dospeli/5.liga-jz - Richard Knop
当我执行echo $optionTags->length;时,它会打印0...这就是为什么循环甚至不运行一次的原因。 - Richard Knop
我会放置 var_dump 来查看 $string$dom 的内容,因为有些东西不起作用。我没有使用过 HTMLPurifier,使用它的原因是什么? - Anthony Forloney
好的,我解决了。HTMLPurifier出于某种原因剥离了整个<select>,尽管它似乎是有效的XHTML。 - Richard Knop

6
如何使用简单的XML和XPath选择器呢?
$xml = new SimpleXMLElement($htmlString);
$result = $xml->xpath('//option[@selected="selected"]');

$option = array_pop($result);
var_dump($option);

(已测试,在PHP 5.3.0上有效)

2
更加优雅的代码,它会遍历html文件中的所有选择框,找到需要的那一个并打印出所选的选项:
$dom = new DOMDocument();
$dom->loadHTMLFile('somefile.html');
$sel = $dom->getElementsByTagName("select");
foreach ($sel as $select){
  if ($select->getAttribute("name") == "someselect") {//find select box with name "someselect"
    $optionTags = $select->getElementsByTagName('option');
    foreach ($optionTags as $tag){
        if ($tag->hasAttribute("selected"))
            echo $tag->nodeValue;
    }
}

1
我通过以下方式得到了它:

$xpath->query("//select[@name='foo']/option[@selected]");

这只返回了已标记为选中的节点(它没有selected="selected")。

1
您在调试中的下一步是验证 $string 是否包含您所期望的值。原始发布的代码是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接