在字符串中添加带下划线的大写字符

时间:2016-11-19 02:23:55

标签: php

我正在尝试转换字符串,例如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;

2 个答案:

答案 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"

Try it online