2012-01-06 59 views
0

我有一個字符串腓獲得來自特定標籤值的字符串

$string= '<Label>1</Label><Value>1</Value><Label>2</Label><Value>2</Value><Label>3</Label><Value>3</Value><Label>4</Label><Value>4</Value><Label>5</Label><Value>5</Value>'; 

我需要的標籤和值標籤值分成兩個獨立的數組。我試着用下面的函數

function getTextBetweenTags($string, $tagname) 
{ 
    $pattern = "/<$tagname>(.*)<\/$tagname>/"; 
    preg_match($pattern, $string, $matches, PREG_OFFSET_CAPTURE); 
    return $matches; 
} 

我創造了另一個功能,使其兩個不同的陣列

function formatChoices($choices) 
{ 
    $return['label'] = $this->getTextBetweenTags($choices, "Label"); 
    $return['value'] = $this->getTextBetweenTags($choices, "Value"); 

    return $return; 
} 

但它返回以下

Array([label] => Array(
     [0] => 1</Label><Value>1</Value><Label>2</Label><Value>2</Value><Label>3</Label><Value>3</Value><Label>4</Label><Value>4</Value><Label>5 
     [1] => 7 
    ) 

[value] => Array 
    (
     [0] => 1</Value><Label>2</Label><Value>2</Value><Label>3</Label><Value>3</Value><Label>4</Label><Value>4</Value><Label>5</Label><Value>5 
     [1] => 23)) 

請幫助。謝謝

+1

爲此使用XML解析器。正則表達式是不爲作業 – 2012-01-06 11:25:21

回答

2

試試這個代碼。

<?php 
$string= '<Label>1</Label><Value>1</Value><Label>2</Label><Value>2</Value><Label>3</Label><Value>3</Value><Label>4</Label><Value>4</Value><Label>5</Label><Value>5</Value>'; 
$array = json_decode(json_encode((array) simplexml_load_string('<data>'.$string.'</data>')),1); 
print_r($array); 
?> 
+1

WTF那一堆函數???這是非常糟糕的做法 - 如果是XML或XML數據,SimpleXML就足夠了 – SergeS 2012-01-06 11:41:31

+0

工作優秀。謝謝 – 2012-01-06 11:46:58

+0

@SergeS:我們必須使用JSON函數來確保在反序列化時沒有可能導致問題的異常值。 – 2012-01-06 12:03:52

0

問題是它儘量匹配匹配點。 (重點是貪婪的。)

編輯:這應該工作:

$pattern = "/<$tagname>(.*?)<\/$tagname>/"; 
1

標籤內部不能有 '<' 和 '>' 字符,所以改變這樣

$pattern = "/<$tagname>([^<>]*)<\/$tagname>/"; 

PS的XML操縱它,最好使用了SimpleXML或DOM或...

+0

此圖案返回下列陣列合適的工具 ( [標號] =>數組 ( [0] => 1 [1] => 7 ) [值] = >陣列 ( [0] => 1 [1] => 23 ) ) – 2012-01-06 11:41:10