2011-05-21 104 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文檔代表結構。正則表達式不能理解這個結構。舉例來說,你只需要'