字符串处理的几段代码,看是不是最优的方法?

zhangking 2008-06-13 03:29:10
<?php
//把字符串中的任意空格换成一个
$str1 = 'A B C ';
echo '<xmp>';
echo preg_replace ("/\s+/", ' ', $str1);
echo '</xmp>';

//把字符串中的任意连续字符 M 换成一个 M
$str1 = 'AMMMBMMMMCMM ';
echo preg_replace ("/M+/", 'M', $str1) .'<br>';

//把字符串中的任意连续字符换成一个对应字符
$str1 = 'ACCCB CCCCCGGG OOO YYYFFFXXXZZZZZ';
echo $str1 .'<br>';
$str2 = '';
$i = 0;
for ($i=0; $i<strlen($str1); $i++)
{
$str2 = $str2 . $str1{$i};
$j = 1;
while ($str1{$i}==$str1{$i + $j})
$j++;
$i = $i + $j - 1;
}
echo $str2 .'<br>';
?>
...全文
200 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxs_2008 2008-06-21
  • 打赏
  • 举报
回复
对于不规则的,个人认为正则最优
zhangking 2008-06-16
  • 打赏
  • 举报
回复
回复楼上:处理字符串,用2个嵌套循环,
和把字符串变为数组,处理完再拼合起来,那个效率高?
看看后者用了多少函数就能想得到快速不快速。
剑心永远OK 2008-06-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhangking 的回复:]
lxtrayn 的 echo preg_replace("/(.)\\1+/","\\1",$str); 是最简洁的方法!!!
nanyang9 的代码正确。
其他人的思路可以,但是结果不正确,也没有循环快速。
其实三种情况可以认为是一种情况,前2种是第三种的特殊情况,实现第三种就可以了。
[/Quote]

楼主,怎么判断效率高低??
SysTem128 2008-06-15
  • 打赏
  • 举报
回复

<?php
/**
* 剔除重复字符
*
* @param String $str 需要处理的字符串
* @param Array<String> [$_sp] 需要削剔的字符列表
* @return String $_result
*/
function trimLetter($str,array $_sp = array()){
$_strLen = strlen($str);
$_result = null;
$_cStr = null;
$_cStrC = null;
$_isEqual = false;
settype($_sp,'array'); // 多疑的人就加上 -_-#
$_isSpEmpty = empty($_sp);
for ($i=0;$i<$_strLen;$i++)
{
$_cStr = $str[$i];
$_cStrC = $str[$i+1];
$_isEqual = ($_cStr == $_cStrC);
if (!$_isSpEmpty)
{
if (in_array($_cStr,$_sp))
{
if(!$_isEqual)
{
$_result .= $_cStr;
}
}else{
$_result .= $_cStr;
}
}else{
if(!$_isEqual)
{
$_result .= $_cStr;
}
}
}
return $_result;
}
$str = 'AABBCCDDEEFFGGHH';
echo trimLetter($str); # ABCDEFGH
echo "\n";
echo trimLetter($str,array('A','C')); # ABBCDDEEFFGGHH
?>


整理了下。
SysTem128 2008-06-15
  • 打赏
  • 举报
回复

<?php
//把字符串中的任意连续字符换成一个对应字符
function trimLetter($str){
$_strLen = strlen($str);
$_result = null;
$_resultLen = 0;
$_cStr = null;
$_pResult = null;
for ($i=0;$i<$_strLen;$i++)
{
$_cStr = $str[$i];
$_pResult = $_result[$_resultLen-1];
if($_cStr != $_pResult)
{
$_resultLen++;
$_result .= $_cStr;
}
}
return $_result;
}
$str = "AACCCCCCCCCCAAAAAAAAAAAAAACCCCCCCCCCCCCCCAAAAAAAAAAAAACCCCCCCCCCC";
echo trimLetter($str); // ACACAC
?>

很明显使用array_unique是有问题的,在这里他只会显示AC。

xiongbing529 2008-06-15
  • 打赏
  • 举报
回复
<?
$str1 = 'AMMMBMMMMCMM ';
$array=array();
for($i=0;false!=($k=$str1[$i]);$i++){
$array[]=$k;
}
echo join("",array_unique($array));
?>
zhangking 2008-06-15
  • 打赏
  • 举报
回复
lxtrayn 的 echo preg_replace("/(.)\\1+/","\\1",$str); 是最简洁的方法!!!
nanyang9 的代码正确。
其他人的思路可以,但是结果不正确,也没有循环快速。
其实三种情况可以认为是一种情况,前2种是第三种的特殊情况,实现第三种就可以了。
my_web 2008-06-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ten789 的回复:]
说是3个问题 其实就是1个问题

把字符串中任意连续的字符转成1个任意字符~

LZ的3段代码优都算不上 何来最优
[/Quote]

把你最优的写上学习学习
lxtrayn 2008-06-13
  • 打赏
  • 举报
回复
前两种没问题,
用正则的后向引用可以简单的完成第三种功能
<?php
$str = 'ACCCB CCCCCGGG OOO YYYFFFXXXZZZZZ';
echo preg_replace("/(.)\\1+/","\\1",$str);

junyi2003 2008-06-13
  • 打赏
  • 举报
回复
考虑这类效率应该不是PHP干的事

还不如你写个C函数然后包装到php库中来得效率高.
剑心永远OK 2008-06-13
  • 打赏
  • 举报
回复
上面用了两种方法验证。。其实用第二种就可以实现三种的了。。


$str1 = 'A B C ';
$str2 = 'AMMMBMMMMCMM ';
$str3 = 'ACCCB CCCCCGGG OOO YYYFFFXXXZZZZZ';
echo trim_more_letter($str1);
echo trim_more_letter($str2);
echo trim_more_letter($str3);
function trim_more_letter($str)
{
if(is_string($str))
{
$new_str=str_split($str,1);
$return_str=array_unique($new_str);
return implode('',$return_str);
}
}
/*
结果:A BC
结果:AMBC
结果:ACB GOYFXZ
*/
剑心永远OK 2008-06-13
  • 打赏
  • 举报
回复
用字符串的函数会比正则的高吧。。
用内置的函数比用循环要高吧。。。

$str1 = 'A B C ';
$str2 = 'AMMMBMMMMCMM ';
echo trim_letter($str2,'M');
function trim_letter($str,$spe)
{
if(is_string($str))
{
$new_str=explode($spe,$str);
$return_str=$spe.implode('',$new_str);
return $return_str;
}
}

$str1 = 'ACCCB CCCCCGGG OOO YYYFFFXXXZZZZZ';
echo trim_more_letter($str1);
function trim_more_letter($str)
{
if(is_string($str))
{
$new_str=str_split($str,1);
$return_str=array_unique($new_str);
return implode('',$return_str);
}
}
老紫竹 2008-06-13
  • 打赏
  • 举报
回复
正则替换 [ ]+ 为 空格就行了,也就是多余一个空格为1个
ten789 2008-06-13
  • 打赏
  • 举报
回复
说是3个问题 其实就是1个问题

把字符串中任意连续的字符转成1个任意字符~

LZ的3段代码优都算不上 何来最优
nanyang9 2008-06-13
  • 打赏
  • 举报
回复
<?php
//把字符串中的任意连续字符换成一个对应字符
$str1 = "ACCCB CCCCCGGG OOO YYYFFFXXXZZZZZ";
echo $str1 . " <br />";
$len = strlen($str1);
$str2 = $str1[0];
$ch = $str2;
for($i=1; $i<$len; $i++){
$ch2=$str1[$i];
if($ch!=$ch2){
$str2.=$ch2;
$ch=$ch2;
}
}
echo $str2 . "<br />";
?>

不太熟PHP,临时看PHP手册写的.
nanyang9 2008-06-13
  • 打赏
  • 举报
回复
开发高效率:如你写的前两段,使用正则式.
执行高效率:不使用正则式.比如做个while循环,不断把两个相同空格替换成一个空格直到没有两个连续空格.
至于你写的第三种情况,创建新的空字串,依次截取源串的每个字符连接到新串中,如果当前字符与前一字符相同则放弃掉.
nanyang9 2008-06-13
  • 打赏
  • 举报
回复
第一二三种情况是同一种情况吗?怎么看都不像.
如果第一二条的测试字串是下面这两个呢

//把字符串中的任意空格换成一个
$str1 = 'A B CCCC DDD';

//把字符串中的任意连续字符 M 换成一个 M
$str1 = 'AMMMBMMMMCMMGGGMDDDD ';


把一二三看成一样的话,能不能得到正确结果?
my_web 2008-06-13
  • 打赏
  • 举报
回复
我只知道把strlen($str1)提出来写好点

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧