2012-10-25 98 views
-1

Possible Duplicate:
How to parse and process HTML with PHP?用PHP解析鍵 - 值跨度對

我有一大堆的代碼,我需要尋找低谷和得到這樣的數據

<span class="parameter-name-value"> 
    <span class="parameter-name">....</span> 
    <span class="parameter-value">....</span> 
</span> 

到一個PHP數組中的

格式
$array = array(
    array("parameter-name", "parameter-value"), 
    array("parameter-name", "parameter-value"), 
    array("parameter-name", "parameter-value") 
) 

我需要什麼樣的正則表達式?

+3

「我需要什麼樣的正則表達式的?」 - 沒有任何一種。 – Quentin

+0

爲什麼你在你的例子中有「parameter-name-value」,你不用它 – Layke

+1

@Layke - 這個問題意味着數據已經存在,而不是它被構造只是爲了被PHP解析。 – Quentin

回答

1

這將是您的設置:

function get_tags($string, $start, $end) 
{ 
    $start = str_replace("\\", "\\\\", $start); 
    $start = str_replace("/", "\/", $start); 
    $end = str_replace("\\", "\\\\", $end); 
    $end = str_replace("/", "\/", $end); 
    preg_match_all("/{$start}(.*?){$end}/si", $string, $matching_data); 
    return $matching_data[0]; 
} 

function return_between($string, $start, $stop, $type) 
{ 
    $temp = split_string($string, $start, false, $type); 
    return split_string($temp, $stop, true, $type); 
} 

function get_attribute($tag, $attribute) 
{ 
    // Remove all line feeds from the string 
    $cleaned_html = str_replace("\r", "", $tag); 
    $cleaned_html = str_replace("\n", "", $cleaned_html); 

    // Use return_between() to find the properly quoted value for the attribute 
    return return_between($cleaned_html, $attribute."=\"", "\"", true); 
} 

要使用它,像這樣:

$open_tag = '<span'; 
$close_tag = '>'; 

$span_tags = get_tags($html_string, $open_tag, $close_tag); 
$span_tag_class_names = array(); 

foreach ($span_tags as $key => $tag) { 
    $class_name = get_attribute($tag, $attribute = "class"); 
    if (!empty($class_name)) { 
     $span_tag_class_names[] = $class_name; 
    } 
} 

print_r($span_tag_class_names); 

與所有的正則表達式,你的里程可能會有所不同。

0

HTML還不清楚,但可以使用DOMDocument無論格式

$html = '<span class="parameter-name-value"> 
    <span class="parameter-name">A</span> 
    <span class="parameter-value">1</span> 
</span> 
<span class="parameter-name-value"> 
    <span class="parameter-name">B</span> 
    <span class="parameter-value">2</span> 
</span>'; 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 
$span = $xpath->query("//span/span"); 

    $dom = new DOMDocument(); 
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 
$span = $xpath->query("//span/span"); 

$list = array(); 
$list2 = array(); 

for($i = 0; $i < $span->length; $i += 2) { 
    $name = $span->item($i); 
    $value = $span->item($i + 1); 
    $list[] = array($name->getAttribute('class') => $name->nodeValue,$value->getAttribute('class') => $value->nodeValue); 
    $list2[] = array($name->getAttribute('class'),$value->getAttribute('class')); 
} 

var_dump($list); 
var_dump($list2); 

輸出$list

array 
    0 => 
    array 
     'parameter-name' => string 'A' (length=1) 
     'parameter-value' => string '1' (length=1) 
    1 => 
    array 
     'parameter-name' => string 'B' (length=1) 
     'parameter-value' => string '2' (length=1) 

輸出$list2

array 
    0 => 
    array 
     0 => string 'parameter-name' (length=14) 
     1 => string 'parameter-value' (length=15) 
    1 => 
    array 
     0 => string 'parameter-name' (length=14) 
     1 => string 'parameter-value' (length=15) 
+0

很好,但getAttribute函數是什麼? '致命錯誤:調用非對象的成員函數getAttribute()' – MikkoP

+0

使用您給我的XML http://codepad.viper-7.com/ppUOyf它的工作原理 – Baba

1

如果你知道你的數據將看起來和你一樣並且它永遠不會改變,那麼使用正則表達式比加載XML庫更快更容易。但請記住,沒有太多的東西需要改變才能失敗。 XML解析器解決方案更加健壯。

$data = '<span class="parameter-name-value"> 
    <span class="parameter-name">A</span> 
    <span class="parameter-value">x</span> 
</span> 
<span class="parameter-name-value"> 
    <span class="parameter-name">B</span> 
    <span class="parameter-value">y</span> 
</span> 
<span class="parameter-name-value"> 
    <span class="parameter-name">C</span> 
    <span class="parameter-value">z</span> 
</span> 
'; 

$pattern = '@<span class=\"parameter-name-value\"> 
    <span class=\"parameter-name\">(.*)</span> 
    <span class=\"parameter-value\">(.*)</span> 
</span>@'; 

preg_match_all($pattern, $data, $matches); 
list($_, $keys, $values) = $matches; 
$result = array_combine($keys, $values); 
print_r($result); 

輸出

Array 
(
    [A] => x 
    [B] => y 
    [C] => z 
) 
+0

Clean +1。但是我會在標籤之間使用'\ s *'來進行更靈活的匹配,並且使用'(。*?)'(帶有惰性量詞)捕獲和單行'''修飾符來允許值中的換行符。 – ridgerunner

+0

對不起,但這不起作用。跨度不是直接排列在一起。 – MikkoP

+0

@MikkoP你能舉一個它不起作用的例子嗎?放入任何東西都不成問題。 – kba