在大写字母处将字符串拆分?

14

如何根据大写字母将$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
4个回答

38

使用preg_split()函数并传入[A-Z]参数即可:

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

编辑
如果你不需要数组本身,你可以使用连字符 (-) 在大写字母(除了首字母)前面插入:

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

(演示)


嗯,在我把我的代码 working 之前,JRL 提供了 lookahead。此外,请注意 $chucks$chunks 的区别。 - jensgram
是时候学习正则表达式了,谢谢你提供这个优雅的解决方案! - gremo
PREG_SPLIT_NOT_EMPTY,是的,太好了!谢谢您包含它! - bryonbean

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

还需要对结果进行 array_shift 操作。 - user142162
array_shift() 只有在句子以大写字母开头时才需要使用... 如果它以小写字母开头,就不要使用 array_shift()。 - Mark Baker
这个答案缺少教育性的解释。 - mickmackusa

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

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

这个答案缺少教育性的解释。 - mickmackusa

0
如果您想将字符串转换为小写,可以使用 @jensgram 的代码,在其中我已将连字符 (-) 更改为下划线 (_)
strtolower(preg_replace('/(?<!^)([A-Z])/', '_\\1', $param));

正如我所寻找的。


修改别人答案中的一个字符并不能使这个答案变得有价值。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接