我正在尝试转换字符串,例如WhatAWonderfulDay
为小写字符串,其中所有大写字符前面都有下划线,例如what_a_wonderful_day
。此外,我正在尝试制作一个反向算法,将我们a_quick_fox
说成AQuickFox
。
我正在提供我的实施,但我知道它效率低下。有什么方法可以简化这两个操作吗?
// 1. WhatAWonderfulDay -> what_a_wonderful_day
$chars = str_split('WhatAWonderfulDay');
$result = "";
foreach($chars as $char) {
if (ctype_upper($char) && !empty($result))
$result .= "_"
$result .= $char;
}
echo $result;
// 2. a_quick_fox => AQuickFox
$chars = str_split('a_quick_fox');
$result = "";
$should_make_upper = true;
foreach($chars as $char) {
$result .= (should_make_upper) ? strtoupper($char) : $char;
$should_make_upper = false;
if ($char == "_")
$should_make_upper = true;
}
echo $result;
答案 0 :(得分:0)
这里有一些简单的代码可以帮助您入门:
$string = "AQuickTest";
preg_match_all("/[A-Z]/",$string,$matches);
foreach($matches[0] as $match){
$string = str_replace($match,"_".strtolower($match),$string);
}
echo $string;
结果是:_a_quick_test
答案 1 :(得分:0)
我使用一些基本的正则表达式得到了一个有效的解决方案。
要在一段文字中添加下划线,请使用:
function addUnderscores($chars) {
return strtolower(preg_replace('/(?<!^)[A-Z]/', '_\\0', $chars));
}
echo addUnderscores('WhatAWonderfulDay'); // Outputs "what_a_wonderful_day"
要删除它们,请使用
function removeUnderscores($chars) {
return preg_replace_callback('/^\w|_(\\w)/', function ($matches) {
return strtoupper((sizeof($matches)==2)?$matches[1]:$matches[0]);
}, $chars);
}
echo removeUnderscores('a_quick_fox'); // Outputs "AQuickFox"