2011-09-06 187 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

相關問題