bbs.thinkzhu.com

?找回密码
?立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3209|回复: 1
打印 上一主题 下一主题

4月8日-驼峰字符串逆转

[复制链接]

170

主题

267

帖子

1539

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1539
跳转到指定楼层
楼主
发表于 2014-4-8 10:53:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
4月6日的一题是将字符串“open_door” 转换成 “OpenDoor”、“make_by_id” 转换成 “MakeById” 。当期参与的人数众多,群里的朋友提议来个逆向的方法,那么今天的一题就是,把驼峰式的字符串变成下划线式的字符串,如讲 “OpenDoor”转换成“open_door”,“MakeById” 转换成 “make_by_id”。这个难度可能比4月6日的大很多 ……
如有疑问,请加PHP高级群:157815728 与高手交流。

170

主题

267

帖子

1539

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1539
沙发
?楼主| 发表于 2014-4-9 10:59:50 | 只看该作者
Zjmainstay的正则果然是厉害,一句话搞定了:
1
$str = strtolower(substr(preg_replace('#[A-Z]#', '_$0', $str), 1));

Zjmainstay的非正则模式,大家注意到最后这个代码最后一行没?为什么有一行注视呢,如果你不懂,请找Zjmainstay请教。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$str = 'OpenDoor';

$changeTo = '';
for($i = 0, $len = strlen($str); $i < $len; $i++) {
//利用字符串下标方式,取到大写的前面提前加_即可
if($str[$i] >= 'A' && $str[$i] <= 'Z') { //ord方式不好记忆,@坚持到底 用的这个好
$changeTo .= '_';
}

//拼接所有字符
$changeTo .= $str[$i];
}

echo strtolower(substr($changeTo, 1)); //小写转换一次性处理,放到循环外面

//End_php

风兮蜻蜒再一次用正则回调搞定了每日一题,厉害!
1
2
3
4
5
6
7
8
9
10


$str = 'MakeById';

$res = preg_replace_callback( '/(^|.)([A-Z])/', function ( $matches ) {
return ( $matches[ 1] ? "$matches[ 1]_" : '' ) . strtolower( $matches[ 2] );
}, $str );

var_dump ( $res );

will的一句话正则也很巧妙
1
echo strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', $str));

Diven的基础比较好,ascii码都记得的很清楚,值得不懂的同学学习下。
1
2
3
4
5
6
7
8
9
10
11
12
13
$test = 'ThisIsATest';
$word_arr = str_split($test,1);
foreach ($word_arr as $k => $v){
if (ord($v)>=65 && ord($v)<=90){
$v = strtolower($v);
if ($k>0){
$v = '_'.$v;
}
}
$word_arr[$k] = $v;
}
$lower_str = implode('', $word_arr);
print_r($lower_str);

这个点点点同学的做法虽然不是最好的,但是这个对比的思想我们可以学习下:
1
2
3
4
5
6
7
8
9
10
11
12

$str = 'MarkById';
$upper_str = strtoupper($str);
$len = strlen($str);? ?
$new_str = $str;
for ($i = 0; $i < $len; $i++) {
if(substr($str , $i , 1) == substr($upper_str, $i ,1)){
$new_str = str_replace(substr($str , $i , 1), '_'.substr($str , $i , 1), $new_str);
}
}
echo strtolower(ltrim($new_str,'_'));

这次的每日一题参与的人众多,还有些代码没放上来,大家可以看评论区。
如有疑问,请加PHP高级群:??157815728 与高手交流。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|bbs.thinkzhu.com ( 京ICP备14043241号 )

Powered by Discuz! X3.4?? 2001-2012 Comsenz Inc.

GMT+8, 2019-10-10 12:18 , Processed in 0.050994 second(s), 24 queries .

快速回复 返回顶部 返回列表