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

使用PHP解析HTML以获取所有选项标记,php,html,Php,Html,我正在解析包含以下内容的HTML页面: <select> <option value="somevalue">Somedata</option> </select> <select> <option value="somevalue">Somedata</option> </select> 一些数据 我需要从中获取一些值和数据 最简单的方法是什么? 应该注意的是,somevalue

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

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

一些数据
我需要从中获取一些值和数据

最简单的方法是什么? 应该注意的是,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>

140
150
160

请注意,名称是始终attrib1

回答您的问题:

最简单的方法是与函数一起使用


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

回答您的问题:

最简单的方法是与函数一起使用

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

使用

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

HTML不是一种常规语言。试着这样解析它,乍一看似乎是可行的,但它最终会咬你的屁股。

使用

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


HTML不是一种常规语言。试着这样解析它,乍一看似乎是可行的,但稍后它肯定会咬你的屁股。

好的,因为我看不到完整的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>
好的,接下来我们需要看看 要求:

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

<select>
    <option value="somevalue">Somedata</option>
</select>
<select>
  <option value="somevalue">Somedata</option>
</select>
现在,我们需要执行此查找,因此我们使用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

好的,因为我看不到完整的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>
好的,接下来我们需要看看 要求:

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

<select>
    <option value="somevalue">Somedata</option>
</select>
<select>
  <option value="somevalue">Somedata</option>
</select>
现在,我们需要执行此查找,因此我们使用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


答案取决于这个HTML是否有效。SimpleXML非常容易使用,但是如果你试图传递一个不一致的HTML文档,它就没有多大用处了。SimpleXML在这里可用吗?如果是,如何显示?您是否能够显示完整的文档?还是这样?这个问题的标题完全没有用。@pt2ph8修复。我假设更改是偶然的。答案将取决于此HTML是否有效。SimpleXML非常容易使用,但是如果你试图传递一个不一致的HTML文档,它就没有多大用处了。SimpleXML在这里可用吗?如果是,如何显示?您是否能够显示完整的文档?还是这样?这个问题的标题完全没有用。@pt2ph8修复。我想这个变化是偶然的,我不同意。DOM解析器可以更准确地获得所需的值(假设它是格式良好的,如果它不是正则表达式解决方案,则会更疯狂),而不需要正则表达式所涉及的复杂的边缘情况。DOM解析器可以更准确地获得所需的值(假设它是格式良好的,如果它不是正则表达式解决方案,将更加疯狂),而不需要正则表达式所涉及的复杂的边缘情况。是的,也许可以解释一下为什么你要求人们不要使用正则表达式?;)HTML文档表示结构。Regex无法理解这种结构。例如,假设您只希望
是特定div的子级?正则表达式版本不了解每个选项元素相对于更高级别元素的位置。它只是尝试将模式与文本匹配。这就是为什么很多人建议不要用正则表达式解析HTML。@乔治:有时候正则表达式会咬你的屁股。正则表达式不适合解析HTML。HTML解析器是。一般来说,当然HTML解析器是正确的选择,但在特定情况下,我不认为正则表达式会有什么问题。也许它现在就可以工作了。但正如我说过的,它会在以后咬你的屁股。相信我。这是我个人的经验是的,也许可以解释为什么你要求人们不要使用正则表达式HTML文档表示结构。Regex无法理解这种结构。例如,假设您只希望
是特定div的子级?正则表达式版本不了解每个选项元素相对于更高级别元素的位置。它只是尝试将模式与文本匹配。这就是为什么很多人建议不要用正则表达式解析HTML。@乔治:有时候正则表达式会咬你的屁股。正则表达式不适合解析HTML。HTML解析器是。一般来说,当然HTML解析器是正确的选择,但在特定情况下,我不认为正则表达式会有什么问题。也许它现在就可以工作了。但正如我说过的,它会在以后咬你的屁股。相信我。这是我个人的经历,谢谢!它工作得很完美:)我希望我能投票给你,但唉,我没有足够的声誉:(尽管如此,非常感谢你!@Eax Just enter'↑ ↑ ↓ ↓ ← → ← → B从第一站开始