怎么把PascalCase转换成pascal_case?


Answers:


163

尝试以下尺寸:

$tests = array(
  'simpleTest' => 'simple_test',
  'easy' => 'easy',
  'HTML' => 'html',
  'simpleXML' => 'simple_xml',
  'PDFLoad' => 'pdf_load',
  'startMIDDLELast' => 'start_middle_last',
  'AString' => 'a_string',
  'Some4Numbers234' => 'some4_numbers234',
  'TEST123String' => 'test123_string',
);

foreach ($tests as $test => $result) {
  $output = from_camel_case($test);
  if ($output === $result) {
    echo "Pass: $test => $result\n";
  } else {
    echo "Fail: $test => $result [$output]\n";
  }
}

function from_camel_case($input) {
  preg_match_all('!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!', $input, $matches);
  $ret = $matches[0];
  foreach ($ret as &$match) {
    $match = $match == strtoupper($match) ? strtolower($match) : lcfirst($match);
  }
  return implode('_', $ret);
}

输出:

Pass: simpleTest => simple_test
Pass: easy => easy
Pass: HTML => html
Pass: simpleXML => simple_xml
Pass: PDFLoad => pdf_load
Pass: startMIDDLELast => start_middle_last
Pass: AString => a_string
Pass: Some4Numbers234 => some4_numbers234
Pass: TEST123String => test123_string

这实现了以下规则:

  1. 以小写字母开头的序列后必须跟小写字母和数字;
  2. 以大写字母开头的序列后面可以是:
    • 一个或多个大写字母和数字(后跟字符串的结尾或大写字母,后跟小写字母或数字,即下一个序列的开头);要么
    • 一个或多个小写字母或数字。

9
它适用于CamelCased字符串(如openfrog要求),但是,如果将其与输入字符串一起使用,例如“ r_id”(已经“加下划线”),它将修剪前缀(“ r_”)。好的解决方案,但绝对不是通用的。
马丁

1
很好奇您为什么要检查字符串是否与全大写字符串匹配?仅将第一个字符转换为小写(相对于所有字符)有什么好处?
乔什(Josh)2015年

1
更简洁的解决方案也可以处理所有这些用例:stackoverflow.com/a/35719689/4328383
Syone

155

较短的解决方案:与编辑器类似,具有简化的正则表达式并解决了“底线下划线”问题:

$output = strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $input));

PHP演示 | 正则表达式演示


请注意,类似的情况SimpleXML将转换为simple_x_m_l使用上述解决方案的情况。这也可以被认为是错误使用骆驼的大小写(正确SimpleXml),而不是算法的错误,因为这样的情况总是模棱两可的-即使将大写字符组合成一个字符串(simple_xml),这种算法在其他边缘情况下也总是会失败喜欢XMLHTMLConverter或缩写附近的一个字母的单词,等等。如果您不介意(很少见)边缘情况并且想SimpleXML正确处理,则可以使用一些更复杂的解决方案:

$output = ltrim(strtolower(preg_replace('/[A-Z]([A-Z](?![a-z]))*/', '_$0', $input)), '_');

PHP演示 | 正则表达式演示


随意评论cletus的答案,详细说明您修复了哪些测试用例。
Mike B

3
我并不是说他的解决方案给出了错误的结果。他的解决方案非常复杂且无效。
JanJakeš13年

1
是的,接受答案肯定是失败的。Jan的解决方案很棒!附带说明一下,我认为这(或稍有变化)是我为PHP开发人员所钟爱的新编码测试,因为对此问题提供的实际上无效的答案数量令人难以置信。这将是进行初始过滤的好方法。:-)
JamesG

发现此解决方案中使用的正则表达式更加完整:stackoverflow.com/questions/2559759/…–
thoroc

2
对于简单用例来说是一个不错的解决方案,在大多数情况下就足够了,但是公认的解决方案可以处理更多用例,例如,“ simpleXML”可以转换为“ simple_xml”而不是“ simple_x_m_l”
Syone

35

简洁的解决方案,可以处理一些棘手的用例:

function decamelize($string) {
    return strtolower(preg_replace(['/([a-z\d])([A-Z])/', '/([^_])([A-Z][a-z])/'], '$1_$2', $string));
}

可以处理所有这些情况:

simpleTest => simple_test
easy => easy
HTML => html
simpleXML => simple_xml
PDFLoad => pdf_load
startMIDDLELast => start_middle_last
AString => a_string
Some4Numbers234 => some4_numbers234
TEST123String => test123_string
hello_world => hello_world
hello__world => hello__world
_hello_world_ => _hello_world_
hello_World => hello_world
HelloWorld => hello_world
helloWorldFoo => hello_world_foo
hello-world => hello-world
myHTMLFiLe => my_html_fi_le
aBaBaB => a_ba_ba_b
BaBaBa => ba_ba_ba
libC => lib_c

您可以在此处测试此功能:http : //syframework.alwaysdata.net/decamelize


@VivekVardhan您不了解此正则表达式的哪一部分?
Syone '16

嗯,我认为小写非驼峰字符串是一种副作用,如果字符串不是驼峰格式,则应返回原始字符串。实际上,如果发送“ simple_Text”,则会失败:simple_Test => simple_Test [simple_test]。仅当原始字符串是真实的驼峰式字符串时,才应使用小写字符串。你有什么想法?
guido

24

从Ruby String#camelize和移植String#decamelize

function decamelize($word) {
  return preg_replace(
    '/(^|[a-z])([A-Z])/e', 
    'strtolower(strlen("\\1") ? "\\1_\\2" : "\\2")',
    $word 
  ); 
}

function camelize($word) { 
  return preg_replace('/(^|_)([a-z])/e', 'strtoupper("\\2")', $word); 
}

上述解决方案可能遗漏的一个技巧是'e'修饰符,该修饰符导致preg_replace将替换字符串评估为PHP代码。


10
在PHP 5.5中已弃用该e标志preg_replace
cdmckay 2012年

顺便说一句,它们也不在Ruby中,而是在Rails的inflector库中-camelize和下划线。api.rubyonrails.org/classes/ActiveSupport/Inflector.html
mahemoff 2012年

2
对于“ ThisIsATest”,此操作将失败。似乎不支持两个连续的大写。
OnaBai

只需注意:您可以使用lcfirst将首字母转换为小写,然后不需要^|or strlen
Benubird13年


23

Symfony的串行组件具有CamelCaseToSnakeCaseNameConverter有两种方法normalize()denormalize()。这些可以如下使用:

$nameConverter = new CamelCaseToSnakeCaseNameConverter();

echo $nameConverter->normalize('camelCase');
// outputs: camel_case

echo $nameConverter->denormalize('snake_case');
// outputs: snakeCase

1
谨防! 在当前版本的Symfony序列化程序组件3.2中$nameConverter->normalize('CamelCase')输出_camel_case
spackmat

21

这里的大多数解决方案都感到费力。这是我使用的:

$underscored = strtolower(
    preg_replace(
        ["/([A-Z]+)/", "/_([A-Z]+)([A-Z][a-z])/"], 
        ["_$1", "_$1_$2"], 
        lcfirst($camelCase)
    )
);

“ CamelCASE”被转换为“ camel_case”

  • lcfirst($camelCase) 将降低第一个字符(避免将“ CamelCASE”转换后的输出以下划线开头)
  • [A-Z] 找到大写字母
  • + 会将每个连续的大写字母视为一个单词(避免将“ CamelCASE”转换为camel_C_A_S_E)
  • 第二种模式和替换用于ThoseSPECCases-> those_spec_cases而不是those_speccases
  • strtolower([…]) 将输出变为小写

3
但这也将CamelCased变成_camel_cased。
acme

1
这很棒-只需添加从char 1开始的substr即可解决该问题。
Oddman

4
优秀!只需要添加lcfirst功能$驼峰
Edakos

可接受的答案将处理:将TestUPSClass转换为test_ups_class,同时将其转换为test_u_p_s_class,需要牢记。
马齐

由于ucfirst()调用,此解决方案将意外地将以allcaps首个“单词”开头的输入字符串拆分。 USADollarSymbol成为u_sa_dollar_symbol 演示,我不推荐这种解决方案,因为它必须使用正则表达式对输入字符串进行两次传递-这是未精炼模式的标志。
mickmackusa

19

php没有为此afaik提供内置函数,但这是我使用的

function uncamelize($camel,$splitter="_") {
    $camel=preg_replace('/(?!^)[[:upper:]][[:lower:]]/', '$0', preg_replace('/(?!^)[[:upper:]]+/', $splitter.'$0', $camel));
    return strtolower($camel);

}

拆分器可以在函数调用中指定,因此您可以像这样调用它

$camelized="thisStringIsCamelized";
echo uncamelize($camelized,"_");
//echoes "this_string_is_camelized"
echo uncamelize($camelized,"-");
//echoes "this-string-is-camelized"

2
对于“ ThisIsATest”,此操作将失败。似乎不支持两个连续的大写。
OnaBai

当然,您忘记了一些东西,因为第二次替换没有任何作用。除此之外,您还可以轻松地使其与mb_strtolower以及上的/u选项成为unicode兼容preg_replace
博多

8

您需要通过它运行一个匹配每个大写字母的正则表达式,除非它在开头,然后用下划线加上该字母替换。utf-8解决方案是这样的:

header('content-type: text/html; charset=utf-8');
$separated = preg_replace('%(?<!^)\p{Lu}%usD', '_$0', 'AaaaBbbbCcccDdddÁáááŐőőő');
$lower = mb_strtolower($separated, 'utf-8');
echo $lower; //aaaa_bbbb_cccc_dddd_áááá_őőőő

如果不确定字符串的大小写,最好先检查一下,因为此代码假定输入是或camelCase而不是underscore_Casedash-Case,因此,如果后者具有大写字母,则会在其下添加下划线。

cletus接受的答案过于复杂,恕我直言,它仅适用于拉丁字符。我发现这是一个非常糟糕的解决方案,并且想知道为什么它完全被接受。转换TEST123Stringtest123_string不一定是有效要求。我宁愿使它简单并分成ABCccc多个部分,a_b_cccc而不是ab_cccc因为它不会丢失信息,并且向后转换将提供与我们开始时完全相同的字符串。即使您想以其他方式执行此操作,(?<!^)\p{Lu}\p{Ll}|(?<=\p{Ll})\p{Lu}如果您不是正则表达式专家,也可以相对容易地为其编写正则表达式或带有两个正则表达式而无需后视。无需将其拆分为多个子字符串,更不用说决定使用just的方式strtolowerlcfirst位置了strtolower


纯代码的答案在Stackoverflow上价值不高,因为它们对教育/授权成千上万的未来研究人员几乎没有作用。
mickmackusa,

@mickmackusa如果研究人员学习如何从SO中进行编码,那么我们将面临一个严重的问题……
inf3rno

现在,您已经摆脱了系统的人身攻击,请改善您的答案。假设您知道解决方案的工作原理以及使用这些模式修饰符的原因,那么我认为没有充分的理由可以隐瞒该社区的知识。如果您正在考虑留下更多狡猾的回应,我向您保证他们不会打扰我。在您发表评论时,您可能已经完成了答案,我们可能删除了我们的评论,而我可能去了其他地方来帮助该站点。
mickmackusa,

当然,我无权删除具有8个投票的帖子。如果愿意,您可以删除答案,但是通过删除不必要的模式修饰符并添加说明来简单地改善它并不是很困难。人身攻击对我没有影响。
mickmackusa

@mickmackusa我也不认为可以删除它。如有需要,请随时进行编辑。
inf3rno

6

如果您正在寻找PHP 5.4版本,以后再回答,则代码如下:

function decamelize($word) {
      return $word = preg_replace_callback(
        "/(^|[a-z])([A-Z])/",
        function($m) { return strtolower(strlen($m[1]) ? "$m[1]_$m[2]" : "$m[2]"); },
        $word
    );

}
function camelize($word) {
    return $word = preg_replace_callback(
        "/(^|_)([a-z])/",
        function($m) { return strtoupper("$m[2]"); },
        $word
    );

} 

camelize为sms_sent产生“ SmsSent”,您需要一个lcfirst
mik3fly-4steri5k

4

根本不花哨,但简单快捷,如地狱般:

function uncamelize($str) 
{
    $str = lcfirst($str);
    $lc = strtolower($str);
    $result = '';
    $length = strlen($str);
    for ($i = 0; $i < $length; $i++) {
        $result .= ($str[$i] == $lc[$i] ? '' : '_') . $lc[$i];
    }
    return $result;
}

echo uncamelize('HelloAWorld'); //hello_a_world

++$i而不是$i++使其速度更快;)
Mathieu Amiot

纯代码的答案在Stackoverflow上价值不高,因为它们对教育/授权成千上万的未来研究人员几乎没有作用。
mickmackusa,

4

从“ CamelCase”到“ camel_case”:

function camelToSnake($camel)
{
    $snake = preg_replace('/[A-Z]/', '_$0', $camel);
    $snake = strtolower($snake);
    $snake = ltrim($snake, '_');
    return $snake;
}

要么:

function camelToSnake($camel)
{
    $snake = preg_replace_callback('/[A-Z]/', function ($match){
        return '_' . strtolower($match[0]);
    }, $camel);
    return ltrim($snake, '_');
}

谢谢。我使用了第一种方法,但使用连字符生成this-kind-of-output
thexpand

3

可以在Alchitect的源代码中找到不使用正则表达式的版本:

decamelize($str, $glue='_')
{
    $counter  = 0;
    $uc_chars = '';
    $new_str  = array();
    $str_len  = strlen($str);

    for ($x=0; $x<$str_len; ++$x)
    {
        $ascii_val = ord($str[$x]);

        if ($ascii_val >= 65 && $ascii_val <= 90)
        {
            $uc_chars .= $str[$x];
        }
    }

    $tok = strtok($str, $uc_chars);

    while ($tok !== false)
    {
        $new_char  = chr(ord($uc_chars[$counter]) + 32);
        $new_str[] = $new_char . $tok;
        $tok       = strtok($uc_chars);

        ++$counter;
    }

    return implode($new_str, $glue);
}

1
这就是没有正则表达式的生活:-)
2010年

4
嗯是的 RegEx绝对有其优势。:)原始速度不是其中之一。
Darrell Brogdon

由于某些原因,此结果有些有趣
mr1031011 2012年

基于此字符串对我不起作用:“ CamelCaseTestAAATestAA”,应该具有:“ camel_case_test_a_a_a_test_a_a”,具有:“” camel_case_test_aest“ ...
Sybio 2013年

3

所以这是一个单线:

strtolower(preg_replace('/(?|([a-z\d])([A-Z])|([^\^])([A-Z][a-z]))/', '$1_$2', $string));

很好,但是它只会转换首次出现的外观,因此我建议g向此正则表达式添加修饰符。
acme 2015年

@acme,我不使用它g,对我来说很好用。
渗入

由于某种原因,我不得不添加g。但是我不记得我测试过的短语。
acme 2015年


3

Laravel 5.6提供了一种非常简单的方法:

 /**
 * Convert a string to snake case.
 *
 * @param  string  $value
 * @param  string  $delimiter
 * @return string
 */
public static function snake($value, $delimiter = '_'): string
{
    if (!ctype_lower($value)) {
        $value = strtolower(preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $value));
    }

    return $value;
}

它的作用:如果发现给定字符串中至少有一个大写字母,它将使用正向搜索来搜索任何字符(.),然后搜索大写字母((?=[A-Z]))。然后,它将找到的字符替换为它的值,然后是separactor _


现在,该函数似乎被称为snake_case(),并且位于全局名称空间中。
Wotuu

2

来自rails的直接端口(减去对::或首字母缩写的特殊处理)为

function underscore($word){
    $word = preg_replace('#([A-Z\d]+)([A-Z][a-z])#','\1_\2', $word);
    $word = preg_replace('#([a-z\d])([A-Z])#', '\1_\2', $word);
    return strtolower(strtr($word, '-', '_'));
}

了解PHP,这将比此处给出的其他答案中进行的手动解析更快。缺点是您没有选择要用什么作为单词之间的分隔符,但这不是问题的一部分。

还要检查相关的rails源代码

请注意,这旨在与ASCII标识符一起使用。如果您需要使用ASCII范围以外的字符来执行此操作,请使用'/ u'修饰符preg_match并使用mb_strtolower


如果仅添加包含所需字符的参数,则可以。
Fleshgrinder 2014年

2

这是我对一个与上帝有关的六年历史问题的贡献,知道有多少答案...

它将提供的字符串中所有驼峰式的单词转换为蛇形。例如,“ SuperSpecialAwesome以及FizBuzzκαιΚάτιΑκόμα”将转换为“ super_special_awesome以及fizz_buzzκαι_κάτι_ακόμα”。

mb_strtolower(
    preg_replace_callback(
        '/(?<!\b|_)\p{Lu}/u',
        function ($a) {
            return "_$a[0]";
        },
        'SuperSpecialAwesome'
    )
);

2

Yii2具有不同的功能,可从CamelCase制作单词snake_case。

    /**
     * Converts any "CamelCased" into an "underscored_word".
     * @param string $words the word(s) to underscore
     * @return string
     */
    public static function underscore($words)
    {
        return strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $words));
    }


2

我有一个类似的问题,但找不到任何答案,无法满足如何将CamelCase转换为snake_case的情况,同时避免了重复或多余的下划线 _带有下划线的名称或所有大写缩写的。

问题如下:

CamelCaseClass            => camel_case_class
ClassName_WithUnderscores => class_name_with_underscore
FAQ                       => faq

我编写的解决方案是一个简单的两个函数调用,即小写和搜索,并替换连续的小写-大写字母:

strtolower(preg_replace("/([a-z])([A-Z])/", "$1_$2", $name));

到目前为止,这是IMO最简洁,最有用的解决方案。
Mr.Shan0

1
function camel2snake($name) {
    $str_arr = str_split($name);
    foreach ($str_arr as $k => &$v) {
        if (ord($v) >= 64 && ord($v) <= 90) { // A = 64; Z = 90
            $v = strtolower($v);
            $v = ($k != 0) ? '_'.$v : $v;
        }
    }
    return implode('', $str_arr);
}

您可以使用$name{$k}(或$name[$k])直接访问char ,这将使您的代码更长,但避免了将其与数组进行相互转换的大量开销。
博多

仅代码的答案在StackOverflow上价值不高,因为它们在赋权/教育未来研究人员方面做得很差。您的解决方案虽然避免了正则表达式的弊端,但是却处理起来繁琐而费力。您正在分割每个字符,并进行多个迭代的函数调用。无需指定空字符串作为胶水。因为没有优雅,低可读性,我不会招待我的项目之一该解决方案ň不必要的函数调用的数量。
mickmackusa

1

这里最差的答案是如此接近最佳(使用框架)。不用,只看一下源代码。看到一个完善的框架使用什么将是一个更加可靠的方法(尝试并测试)。Zend框架具有一些适合您需求的单词过滤器。资源

这是我从源头改编的几种方法。

function CamelCaseToSeparator($value,$separator = ' ')
{
    if (!is_scalar($value) && !is_array($value)) {
        return $value;
    }
    if (defined('PREG_BAD_UTF8_OFFSET_ERROR') && preg_match('/\pL/u', 'a') == 1) {
        $pattern     = ['#(?<=(?:\p{Lu}))(\p{Lu}\p{Ll})#', '#(?<=(?:\p{Ll}|\p{Nd}))(\p{Lu})#'];
        $replacement = [$separator . '\1', $separator . '\1'];
    } else {
        $pattern     = ['#(?<=(?:[A-Z]))([A-Z]+)([A-Z][a-z])#', '#(?<=(?:[a-z0-9]))([A-Z])#'];
        $replacement = ['\1' . $separator . '\2', $separator . '\1'];
    }
    return preg_replace($pattern, $replacement, $value);
}
function CamelCaseToUnderscore($value){
    return CamelCaseToSeparator($value,'_');
}
function CamelCaseToDash($value){
    return CamelCaseToSeparator($value,'-');
}
$string = CamelCaseToUnderscore("CamelCase");

1

有一个提供此功能的

SnakeCaseFormatter::run('CamelCase'); // Output: "camel_case"

1
我认为您的意思是“我已经创建了一个提供此功能的库”。自我提升没有错,但不要掩饰。
icc97


1

这是较短的方法之一:

function camel_to_snake($input)
{
    return strtolower(ltrim(preg_replace('/([A-Z])/', '_\\1', $input), '_'));
}

纯代码的答案在Stackoverflow上价值不高,因为它们对教育/授权成千上万的未来研究人员几乎没有作用。
mickmackusa,

1
@mickmackusa-数以千计的未来研究将对优雅的单线飞机感兴趣,并进行自我教育。
Teson

对不起,您采取了这种自私的态度。您当然可以在设计和输入该时髦回复时花费一些时间。您的答案进行了三个函数调用,而其他函数则执行了两个。
mickmackusa

1

如何不使用正则表达式取消驼峰:

function decamelize($str, $glue = '_') {
    $capitals = [];
    $replace  = [];

    foreach(str_split($str) as $index => $char) {
        if(!ctype_upper($char)) {
            continue;
        }

        $capitals[] = $char;
        $replace[]  = ($index > 0 ? $glue : '') . strtolower($char);
    }

    if(count($capitals) > 0) {
        return str_replace($capitals, $replace, $str);
    }

    return $str;
}

编辑:

我将如何在2019年做到这一点:

function toSnakeCase($str, $glue = '_') {
    return preg_replace_callback('/[A-Z]/', function ($matches) use ($glue) {
        return $glue . strtolower($matches[0]);
    }, $str);
}

当PHP 7.4发布时:

function toSnakeCase($str, $glue = '_') {
    return preg_replace_callback('/[A-Z]/', fn($matches) => $glue . strtolower($matches[0]), $str);
}

1
仅代码的答案在StackOverflow上价值不高,因为它们在赋权/教育未来研究人员方面做得很差。在字符串中的每个字符上进行1到3个函数调用,然后在循环完成后再进行两个函数调用非常繁琐。我不会以如此糟糕的经济来解决问题。
mickmackusa

这是一个示例,无需使用正则表达式即可完成操作,而不是在生产环境中使用它,因此,除了您抱怨5y / o答案被否决并且不太可能被别人看到之外,我看不出您的意思。任何研究人员。
巴尔德斯

我关注所有帖子,而不仅仅是高度赞扬的帖子或最近发表的帖子。我并不是在抱怨,我只是提出批评,以便知识较少的研究人员可以更好地理解此答案与其他答案之间的区别。您可能已经在帖子中解释说,避免正则表达式只是一个学术挑战。也就是说,有一些方法可以通过更好的编码实践来使此过程更有效。
mickmackusa,

0

使用Zend Word Filters的Filter类很容易:

<?php
namespace MyNamespace\Utility;

use Zend\Filter\Word\CamelCaseToUnderscore;
use Zend\Filter\Word\UnderscoreToCamelCase;

class String
{
    public function test()
    {
        $underscoredStrings = array(
            'simple_test',
            'easy',
            'html',
            'simple_xml',
            'pdf_load',
            'start_middle_last',
            'a_string',
            'some4_numbers234',
            'test123_string',
        );
        $camelCasedStrings = array(
            'simpleTest',
            'easy',
            'HTML',
            'simpleXML',
            'PDFLoad',
            'startMIDDLELast',
            'AString',
            'Some4Numbers234',
            'TEST123String',
        );
        echo PHP_EOL . '-----' . 'underscoreToCamelCase' . '-----' . PHP_EOL;
        foreach ($underscoredStrings as $rawString) {
            $filteredString = $this->underscoreToCamelCase($rawString);
            echo PHP_EOL . $rawString . ' >>> ' . $filteredString . PHP_EOL;
        }
        echo PHP_EOL . '-----' . 'camelCaseToUnderscore' . '-----' . PHP_EOL;
        foreach ($camelCasedStrings as $rawString) {
            $filteredString = $this->camelCaseToUnderscore($rawString);
            echo PHP_EOL . $rawString . ' >>> ' . $filteredString . PHP_EOL;
        }
    }

    public function camelCaseToUnderscore($input)
    {
        $camelCaseToSeparatorFilter = new CamelCaseToUnderscore();
        $result = $camelCaseToSeparatorFilter->filter($input);
        $result = strtolower($result);
        return $result;
    }

    public function underscoreToCamelCase($input)
    {
        $underscoreToCamelCaseFilter = new UnderscoreToCamelCase();
        $result = $underscoreToCamelCaseFilter->filter($input);
        return $result;
    }
}

----- underscoreToCamelCase -----

simple_test >>> SimpleTest

容易>>>容易

html >>> HTML

simple_xml >>> SimpleXml

pdf_load >>> PdfLoad

start_middle_last >>> StartMiddleLast

a_string >>> AString

some4_numbers234 >>> Some4Numbers234

test123_string >>> Test123String

----- camelCaseToUnderscore -----

simpleTest >>> simple_test

容易>>>容易

HTML >>> HTML

simpleXML >>> simple_xml

PDFLoad >>> pdf_load

startMIDDLELast >>> start_middle_last

AString >>> a_string

Some4Numbers234 >>> some4_numbers234

TEST123String >>> test123_string


0

开源的TurboCommons库在StringUtils类中包含一个通用的formatCase()方法,该方法可让您将字符串转换为许多常见的大小写格式,例如CamelCase,UpperCamelCase,LowerCamelCase,snake_case,Title Case等。

https://github.com/edertone/TurboCommons

要使用它,请将phar文件导入您的项目,然后:

use org\turbocommons\src\main\php\utils\StringUtils;

echo StringUtils::formatCase('camelCase', StringUtils::FORMAT_SNAKE_CASE);

// will output 'camel_Case'


-1

如果您可以从以下内容开始:

$string = 'Camel_Case'; // underscore or any other separator...

然后,您可以仅使用以下方法转换为两种情况:

$pascal = str_replace("_", "", $string);
$snake = strtolower($string);

或任何其他情况:

$capitalized = str_replace("_", " ", $string); // Camel Case
$constant = strtoupper($string);               // CAMEL_CASE
$train = str_replace("_", "-", $snake);        // camel-case
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.