2010-05-27 66 views
0

我有可能是兩種形式之一的字符串:聰明的方式來有條件地拆分這個字符串?

prefix=key=value (which could have any characters, including '=') 

key=value 

所以我需要將它拆分無論是在第一或第二等號的基礎上,布爾值被設置在其他地方。我這樣做:

if ($split_on_second) { 
    $parts = explode('=', $str, 3); 
    $key = $parts[0] . '=' . $parts[1]; 
    $val = $parts[2]; 
} else { 
    $parts = explode('=', $str, 2); 
    $key = $parts[0]; 
    $val = $parts[1]; 
} 

這應該工作,但感覺不雅。有任何更好的想法在PHP? (我想有一個正則表達式忍者的方式來做到這一點,但我不是一個正則表達式忍者;-)

+4

使用正則表達式會導致兩個問題。 – CMircea 2010-05-27 22:05:08

+0

OT:如果'value'可以包含'=',那麼'$ val'賦值似乎是錯誤的...... – schnaader 2010-05-27 22:08:43

+0

您是否使用「prefix = key = vale」?如果你有選擇,把事情改爲「前綴:鍵=值」和「鍵=值」將使你的生活變得更加簡單。 – 2010-05-27 22:11:11

回答

2

如何只

$parts = explode('=', $str); 
$key = array_shift($parts); 
//additionally, shift off the second part of the key 
if($split_on_second) 
{ 
    $key = $key . '=' . array_shift($parts); 
} 
//recombine any accidentally split parts of the value. 
$val = implode($parts, "="); 

另一個變化

$explodeLimit = 2; 
if($split_on_second) 
{ 
    $explodeLimit++; 
} 
$parts = explode('=', $str, $explodeLimit); 
//the val is what's left at the end 
$val = array_pop($parts); 
//recombine a split key if necessary 
$key = implode($parts, "="); 

並沒有測試過這一點,但看起來它可能是其中的一個有趣的優化,使代碼準確,但無法讀取...

$explodeLimit = 2; 
//when split_on_second is true, it bumps the value up to 3 
$parts = explode('=', $str, $explodeLimit + $split_on_second); 
//the val is what's left at the end 
$val = array_pop($parts); 
//recombine a split key if necessary 
$key = implode($parts, "="); 
+0

從我+1,因爲我們似乎有相同的想法:) – Amber 2010-05-27 22:16:12

+0

你的優化讓我害怕。 :)如果$ split_on_second = 3呢? (理論上,它應該是一個嚴格的布爾值,但是用php,你永遠不會知道,我想你可以把它放在一定的位置。)我可能會用'$ explodeLimit =($ split_on_second)來優化它嗎? 3:2「。 – sprugman 2010-05-27 22:30:29

+0

我知道,C風格的真假是瘋狂的可以利用的,對!它讓我害怕,但手榴彈也是如此,軍隊仍在使用這些手榴彈! – Zak 2010-05-28 00:29:59

5

編輯:

現在我注意到,你得到了「如果前綴應該是有或沒有「,在這種情況下,我原來的解決方案可能不太優雅。相反,我建議是這樣的:

$parts = explode('=', $str); 
$key = array_shift($parts); 
if($has_prefix) { 
    $key .= '=' . array_shift($parts); 
} 
$val = implode('=', $parts); 

我原來的迴應:

$parts = array_reverse(explode('=', $str)); 
$val = array_shift($parts); 
$key = implode('=', array_reverse($parts)); 
+0

@Amber擊敗我! +1的速度 – jcolebrand 2010-05-27 22:09:00

+0

實際上,我需要稍微修改它,因爲$ key部分會被逆轉atm。編輯:現在修正。 – Amber 2010-05-27 22:09:43

+0

好像這樣會忽略$ value包含=號的情況 – Zak 2010-05-27 22:12:30

1
if ($prefix_exists) { 
    list($prefix, $str) = explode('=', $str, 2); 
    $prefix .= '='; 
} 

list($key, $val) = explode('=', $str, 2); 
$key = $prefix . $key; 
+0

這種變化似乎沒有重組前綴和(子)鍵 – Zak 2010-05-27 22:18:15

+0

啊,謝謝,修正。 – 2010-05-27 22:23:08

+0

+1準確性:) – Zak 2010-05-27 22:26:09