2011-09-06 184 views
2

我很难将这个字符串拆分为我需要的模式中的一个数组。该字符串是:将一个字符串拆分成一个数组

ATTRIBUTE1: +VALUE1; 
ATTRIBUTE2: -VALUE2%; 

我基本上需要一个这样的数组:

array (
    [0] => "ATTRIBUTE1", 
    [1] => "+", 
    [2] => "VALUE1", 
    [3] => "%" 
) 
array (
    [0] => "ATTRIBUTE2", ... 
) 

的 “%” 是可选的,但+/-符号是没有的。任何帮助,将不胜感激!

+0

是的,编辑和修复。 – Alper

回答

3

你可以使用正则表达式:

$text= "ATTRIBUTE1: +VALUE1;\nATTRIBUTE2: -VALUE2%;"; 
echo "STRING\n" . $text . "\n\n"; 

preg_match_all("~ 
       ^   # match start of line 
       ([^:]+):\s* # match anything that's not a ':' (attribute), followed by a colon and spaces 
       ([+-])  # match a plus or a minus sign 
       ([^%;]+)  # match anything that's not a '%' or ';' (value) 
       (%?)   # optionally match percent sign 
       ;\s*$   # match ';' then optional spaces and end of line 
       ~mx", $text, $matches, PREG_SET_ORDER); 

print_r($matches); 

打印:

STRING 
ATTRIBUTE1: +VALUE1; 
ATTRIBUTE2: -VALUE2%; 

Array 
(
    [0] => Array 
     (
      [0] => ATTRIBUTE1: +VALUE1; 
      [1] => ATTRIBUTE1 
      [2] => + 
      [3] => VALUE1 
      [4] => 
     ) 

    [1] => Array 
     (
      [0] => ATTRIBUTE2: -VALUE2%; 
      [1] => ATTRIBUTE2 
      [2] => - 
      [3] => VALUE2 
      [4] => % 
     ) 

) 

您可能需要玩的正则表达式,但它的现在得到了评论,所以不应该太难弄明白。

+0

+1这正是OP所需要的。 – Tadeck

+0

嘿,我赞赏正则表达式的解释,我一直有这个问题。这是我需要的。 +1 – Alper

+0

@Alper我得到了“%是可选的,但+/-符号不是。”向后。我修正了正则表达式来反映变化。 – NullUserException

-1

有一两件事你可以做:

$str=explode(": ",$str); 
$array[0]=$str[0]; 
$array[1]=substr($str[1],0,1); 
if(substr($str[1],strlen($str[1])-1)=="%"){ 
    $array[2]=substr($str[1],1,strlen($str[1])-2); 
    $array[3]="%"; 
}else 
    $array[2]=substr($str[1],1); 
+0

你可能需要稍微玩弄一下,但是这会得到希望的基本想法。 –

+0

特别是由于OP使用的关键词看起来好像会改变长度,所以需要对每个不同的变体进行完全重写,如果他拥有数百或数千个这样的组,则不可行。 – Nightfirecat

相关问题