zoukankan      html  css  js  c++  java
  • php 把驼峰样式的字符串转换成下划线样式的字符串

    1、如何在php中把驼峰样式的字符串转换成下划线样式的字符串。例:输入是FooBar的话,输出则是foo_bar

    以下是用正则的方式去完成,既然用到正则,方法肯定就不只一种,我们看下下面的方式

    echo strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', 'fooBar'));
    //output:foo_bar
    echo "<br>";
    echo strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', 'foo'));
    //output:foo
    echo "<br>";
    echo strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', 'fooBarB'));
    //output:foo_bar_b
    echo "<br>";

    下面我们来解释下,上面正则的意思。具体正则的基本知识,这里篇幅有限就不具体介绍了,文章末尾会放出几篇写的比较好的正则表达式的文章。

    上面的正则里面主要用到了正则表达式中的环视边界匹配的语法。具体定义如下(摘抄):

    环视的字面意思就是左右看看,需要左右符合一些条件,本质上,它也是匹配边界,对边界有一些要求,这个要求是针对左边或右边的字符串的,根据要求不同,分为四种环视:

    • 肯定顺序环视,语法是(?=...),要求右边的字符串匹配指定的表达式,比如表达式abc(?=def),(?=def)在字符c右面,即匹配c右面的边界,对这个边界的要求是,它的右边有def,比如abcdef,如果没有,比如abcd,则不匹配;
    • 否定顺序环视,语法是(?!...),要求右边的字符串不能匹配指定的表达式,比如表达式s(?!ing),匹配一般的s,但不匹配后面有ing的s;
    • 肯定逆序环视,语法是(?<=...),要求左边的字符串匹配指定的表达式,比如表达式(?<=s)abc,(?<=s)在字符a左边,即匹配a左边的边界,对这个边界的要求是,它的左边必须是空白字符;
    • 否定逆序环视,语法是(?<!...),要求左边的字符串不能匹配指定的表达式,比如表达式(?<!w)cat,(?<!w)在字符c左边,即匹配c左边的边界,对这个边界的要求是,它的左边不能是单词字符。

    可以看出,环视也使用括号(),不过,它不是分组,不占用分组编号。

    继续回到我们上面的正则表达式,第一个小括号(?<=[a-z]),这是肯定逆序环视的语法,要求匹配的字符串的左边必须有小写的字母。第二个小括号则是一个分组,匹配大写的字母,注意正则中的分组编号是从1开始的,这和我们传统编程下标一般是从0开始不同。而第一个小括号本身就是语法,其不占用分组编号,所以后面的$1,则是匹配的第二个小括号中的内容,并将其前面添加一个_符号,最后再整体将整个字符串转换成小写。

    既然我们已经能把驼峰法转为下划线的样式了,如果反过来又该怎办呢?

    2、如何在php中把下划线样式的字符串转换成驼峰样式的字符串。例:输入是foo_bar的话,输出则是FooBar

    $str = preg_replace_callback('/_+([a-z])/',function($matches){
        print_r($matches);  //Array ( [0] => _b [1] => b )
        return strtoupper($matches[1]);
    },'foo_bar');
    echo $str;  //fooBar
    echo "<br>";
    $str = preg_replace_callback('/_+([a-z])/',function($matches){
        return strtoupper($matches[1]);
    },'foo');
    echo $str;  //foo
    echo "<br>";
    $str = preg_replace_callback('/_+([a-z])/',function($matches){
        return strtoupper($matches[1]);
    },'foo_bar_b');
    echo $str;  //fooBarB
    echo "<br>";
    

    这里我们用到了preg_replace_callback函数,该函数执行一个正则表达式搜索并且使用一个回调进行替换。换言之,就是第一个参数是正则表达式,第二个参数是一个匹配到结果的回调函数,第三个参数是需要匹配的字符串。注意,回调函数具体什么时候调用,是每次匹配到结果则调用,调用次数不只为一次,匹配不到则不调用。并且该回调函数的参数是匹配的结果,$matches[0]是完整的匹配,$matches[1]是第一个捕获子组的匹配,以此类推。且回调函数需要把更改的结果return出去,不然则忽略捕获的字符串
    正则表达式比较简单,这里就不具体分析了。

    正则速查表

    下面,我们用表格的形式简要汇总下正则表达式的语法。

     

    下面是几篇比较值得学习的正则表达式的文章,本文部分参考也来源于此。

    正则表达式30分钟入门教程

    https://deerchao.net/tutorials/regex/regex-1.htm

    计算机程序的思维逻辑 (88) - 正则表达式 (上)

    http://www.cnblogs.com/swiftma/p/6947316.html

  • 相关阅读:
    CentOS查看CPU信息、位数、多核信息
    Linux常用命令大全
    chmod命令详细用法
    tar命令的详细解释
    yum和rpm命令详解
    LeetCode 241. Different Ways to Add Parentheses
    LeetCode 139. Word Break
    LeetCode 201. Bitwise AND of Numbers Range
    LeetCode 486. Predict the Winner
    LeetCode 17. Letter Combinations of a Phone Number
  • 原文地址:https://www.cnblogs.com/kangjianrong/p/7065079.html
Copyright © 2011-2022 走看看