2011-05-21 51 views
0

我解析和HTML页面包含:解析HTML来获取所有选项标签用PHP

<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!

+0

答案取决于该HTML是否有效。 SimpleXML非常易于使用,但如果您尝试将它传递给不符合要求的HTML文档,它将不会很有用。 – 2011-05-21 01:37:56

+0

我编辑了原文,以反映它的外观。 SimpleXML可以在这里使用吗?如果是这样,怎么样? – Eax 2011-05-21 01:57:50

+0

你能够显示完整文档吗?或者是它? – 2011-05-21 02:36:19

回答

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> 

而且我需要同时得到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 

在那里,你有它。

+0

非常感谢!它的作品完美:)我希望我能upvote你,但唉,我没有足够的声誉:( 尽管如此,非常感谢你! – Eax 2011-05-22 12:10:23

+0

@Eax只要输入'↑↑↓↓←→←→BA开始'在无限声誉的主屏幕 – 2011-05-22 12:23:27

+0

嗯,我知道Konami代码修复了一切,但它真的有效吗?:P(你可能会在这里拉我的腿......但是SO的开发人员可能就是那么棒。)另外,我的键盘xD上没有启动按钮 – Eax 2011-05-22 12:42:52

0

回答你的问题:

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

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

+0

我不同意这里。一个DOM解析器可以更准确地获得必要的值(假设它是良构的,如果它不是一个正则表达式的解决方案会更疯狂),而没有正则表达式会涉及的复杂边缘情况。 – 2011-05-21 01:40:07

2

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

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

HTML是不是一个正规的语言。试图解析它,乍一看似乎工作,但它会明确地咬你后来的屁股。

+1

正则表达式有什么问题? – 2011-05-21 01:44:04

+0

是的,也许有些解释你为什么要求人们不要使用正则表达式? ;) – Tadeck 2011-05-21 02:21:04

+2

HTML文档代表结构。正则表达式不能理解这个结构。举例来说,你只需要'