2011-06-19 140 views
0

之間得到我有這樣PHP,HTML標記,正則表達式

<option value="berkshire">Berkshire             
<option value="reading">Reading</option></optgroup> 
<option value="buckinghamshire">Buckinghamshire 
<option value="milton-keynes">Milton Keynes</option></optgroup> 
<option value="east-sussex">East Sussex<option value="brighton">Brighton</option> </optgroup> 

一個html塊,我需要到目前爲止提取值和名稱(例如,值=伯克希爾,名稱=伯克希爾

我已經試過兩種方法:1。

 
function get_between($content,$start,$end){ 
    $r = explode($start, $content); 
    if (isset($r[1])){ 
     $r = explode($end, $r[1]); 
     return $r[0]; 
    } 
    return ''; 
} 


    $value = get_between($htmlContent, 'value="', '">'); 
    $name = get_between($htmlContent, "$value\">", ''); 

這裏的問題是,它僅獲取第一個名稱 - 值(伯克希爾伯克希爾)如果我讓$ R [1] dymanic並設置$ R。 [2],$ r [4]等與時間或foreach我只得到的價值和名稱不會返回由於某些原因,我不明白。

2.Regex 我試圖提取至少「價值」,但無法得到正確的正則表達式,所以對於「名稱」我甚至沒有一個起點。

 
    $pattern = "//"; 
preg_match_all($pattern,$htmlContent, $matches); 
print_r($matches); 

任何幫助,將不勝感激。

回答

0

如果你的HTML塊是一致的,你當然可以用一個簡單的正則表達式提取

preg_match_all('#<option\s+value="([^"]+)">([^<]*)#i') 
// requires to strip trailing whitespace from the name in $matches[2] 

但如果要真正地獲取來自現實世界的HTML內容,那麼它更容易使用DOM解析器像phpQuery或QueryPath爲了簡單:

foreach (qp($html)->find("option") as $opt) { 
    echo $name = $opt->text(), $opt->attr("value"); 
} 
0

只獲取第一個名稱,價值,因爲你沒有嘗試的選項之間的分裂。這是我的問題解決方案(不是正則表達式)。這些線路get_between()功能後去:如果刪除@

$results = array(); 
$dom = new DOMDocument; 
@$dom->loadHTML($html); 
$xpath = new DomXpath($dom); 
foreach($xpath->query('//option[@value]') as $node) { 
    $results[] = array(
     'value' => $node->getAttribute('value'), 
     'name' => trim($node->nodeValue) 
    ); 
} 
var_dump($results); 

$opt = explode('<option ', $html); 
foreach ($opt as $split_html) { 
    $value = get_between($split_html, 'value="', '">'); 
    $name = get_between($split_html, "$value\">", ' '); 
    echo $value ." ". $name . "<br />"; 
} 
0

可以使用的DomDocument正常化HTML輸入和XPath讓你感興趣的值來實現在第三行前面,您將看到HTML塊內的錯誤。