解析HTML以使用PHP获取所有Option标记

时间:2011-05-21 01:33:07

标签: php html

我正在解析包含以下内容的HTML页面:

<select>
    <option value="somevalue">Somedata</option>
</select>

我需要从那里得到somevalue和somedata。

最简单的方法是什么? 应该注意的是,somevalue和Somedata总是不同(可以这么说)

形成如下:

 <select name="attrib1" class="Input">
    <option value="0">&nbsp;</option>
    <option value="140">140</option>
    <option value="141">150</option>
    <option value="142">160</option>
  </select>

请注意,名称总是 attrib1!

3 个答案:

答案 0 :(得分:4)

好的,因为我看不到完整的HTML,我不确定它是否格式正确,所以我会尝试使用更宽容的DOM函数来做到这一点。首先,我将使用这个最小的html文件作为示例:

<强>的test.html

<html>
<body>
 <select name="attrib1" class="Input">
    <option value="0">&nbsp;</option>
    <option value="140">140</option>
    <option value="141">150</option>
    <option value="142">160</option>
  </select>
</body>
</html>

现在,我们需要做的第一件事就是创建一个DOM解析器。我们会这样做:

$doc = new DOMDocument();
$doc->loadHTMLFile("test.html");
  

好的,接下来我们需要看一下   要求:

     

我正在解析和HTML页面   包含一个:

<select>
  <option value="somevalue">Somedata</option>
</select>
     

我需要同时获得一些价值   有些数据出来了。

你还提到:

  

请注意,名称总是attrib1!

根据这些要求,我将选择名为“attrib1”的所有选项标签。为此,我将使用一个名为XPath的东西。这是一种根据特定条件选择dom元素的非常灵活的方法。让我们慢慢建立起来:

*/ 
select all elements

*/select 
select all elements that are select elements

*/select[@name='attrib1'] 
select all elements that are select elements with the name of attrib1

*/select[@name='attrib1']/option select all 
select all option elements under all select elements with the name of attrib1

现在,我们需要进行此查找,因此我们使用XPath函数:

$xpath = new DOMXpath($doc);
$options = $xpath->query("*/select[@name='attrib1']/option");
foreach ($options as $option) {
}

现在我们需要value属性和里面的文本。我们首先得到value属性:

$optionValue = $option->getAttribute('value');

然后我们得到选项标签内的内容:

$optionContent = $option->nodeValue;

一旦我们将这一切放在一起:

$doc = new DOMDocument();
$doc->loadHTMLFile("test.html");

$xpath = new DOMXpath($doc);
$options = $xpath->query("*/select[@name='attrib1']/option");
foreach ($options as $option) {
  $optionValue = $option->getAttribute('value');
  $optionContent = $option->nodeValue;
  echo "$optionValue and $optionContent\n";
}

我们将得到以下输出:

0 and  
140 and 140
141 and 150
142 and 160

你有它。

答案 1 :(得分:2)

使用http://php.net/manual/en/book.dom.php

请不要尝试使用正则表达式

HTML不是常规语言。试图解析它,乍一看似乎会起作用,但是它会在以后明确地咬你。

答案 2 :(得分:0)

回答你的问题:

最简单的方法是将regular expressionspreg_match_all()功能一起使用。

您必须创建一些匹配所有选项标记的正则表达式,并提取所需的两个值。