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