2012-01-06 56 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