解析HTML来获取所有选项标签用PHP
我解析和HTML页面包含:解析HTML来获取所有选项标签用PHP
<select>
<option value="somevalue">Somedata</option>
</select>
,我需要同时获得someValue中和somedata离开那里。
最简单的方法是什么? 应当指出的是,someValue中和Somedata始终是不同的(这么说)
它形成这样的:
<select name="attrib1" class="Input">
<option value="0"> </option>
<option value="140">140</option>
<option value="141">150</option>
<option value="142">160</option>
</select>
请注意,该名称是总是 attrib1!
好吧,由于我看不到完整的HTML,我不确定它是否格式良好,所以我会尝试使用更宽容的DOM函数来做到这一点。首先,我要利用这个最小的HTML文件作为样本:
的test.html
<html>
<body>
<select name="attrib1" class="Input">
<option value="0"> </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>
而且我需要同时得到somevalue和 somedata。
你还别说:
请注意,该名称始终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) {
}
现在我们需要的价值属性,里面的文字。我们首先获得的价值属性:
$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
在那里,你有它。
我不同意这里。一个DOM解析器可以更准确地获得必要的值(假设它是良构的,如果它不是一个正则表达式的解决方案会更疯狂),而没有正则表达式会涉及的复杂边缘情况。 – 2011-05-21 01:40:07
正则表达式有什么问题? – 2011-05-21 01:44:04
是的,也许有些解释你为什么要求人们不要使用正则表达式? ;) – Tadeck 2011-05-21 02:21:04
HTML文档代表结构。正则表达式不能理解这个结构。举例来说,你只需要'
答案取决于该HTML是否有效。 SimpleXML非常易于使用,但如果您尝试将它传递给不符合要求的HTML文档,它将不会很有用。 – 2011-05-21 01:37:56
我编辑了原文,以反映它的外观。 SimpleXML可以在这里使用吗?如果是这样,怎么样? – Eax 2011-05-21 01:57:50
你能够显示完整文档吗?或者是它? – 2011-05-21 02:36:19