2011-12-20 104 views
12

郝我可以爆炸$param字符串到$chunks件基于大写字母?爆炸大写字符的字符串?

$string = 'setIfUnmodifiedSince'; 
$method = substr($string, 0, 3); 
$param = substr($string, 3); 

// Split $param and implode with '-' separator 
$chunks = splitAtUpperCase($param); // Chunks are: 'If', 'Unmodified' and 'Since' 
$field = implode('-', $chunks); // Get If-Unmodified-Since HTTP field name 

回答

31

使用preg_split()[A-Z]应该做的:

function splitAtUpperCase($s) { 
     return preg_split('/(?=[A-Z])/', $s, -1, PREG_SPLIT_NO_EMPTY); 
} 

编辑
如果你不需要数组本身,你可以preprend大写字符(除第一个)用连字符(-):

preg_replace('/(?<!^)([A-Z])/', '-\\1', $param); 

demo

+0

嗯,JRL提供的[先行](http://www.regular-expressions.info/lookaround.html#lookahead)之前,我有矿[工作](http://www.ideone.com/4ux5G):)另外,请注意'$ chucks'与'$ chunks' – jensgram 2011-12-20 15:03:56

+0

我认为学习正则表达式的时间。感谢这个优雅的解决方案! – gremo 2011-12-20 15:26:40

5
$chunks = preg_split('/(?=[A-Z])/', $string); 
+0

还需要'array_shift'结果。 – 2011-12-20 15:00:07

+0

仅当句子以大写字母开头时才需要array_shift ...如果以小写字母开头,请不要array_shift() – 2011-12-20 15:07:49

0
function splitAtUpperCase($string){ 
    return preg_replace('/([a-z0-9])?([A-Z])/','$1-$2',$string); 
} 

$string = 'setIfUnmodifiedSince'; 
echo splitAtUpperCase($string);