最简单的方法来替换字符串中偶数位置的所有字符。

时间:2016-11-02 07:39:39

标签: php string

$str = "helloworld";

我想创建字符串

$newStr = "h l o o l ";

所以你可以看到我想替换位置上的字符2,4,6,8,10 (假设第一个角色位于第1位)。

我可以做这样的事情

<?php

$str = 'helloworld';
$newStr = '';
for($i=0;$i<strlen($str);$i++) {
    if($i%2==0) {
        $newStr .=  $str[$i];
    } else {
           $newStr .= ' ';
    }
}

echo $newStr;

?>

但是有更简单的方法或构建函数中的一行可用于执行此任务。

提前致谢。

5 个答案:

答案 0 :(得分:10)

使用正则表达式很容易完成:

echo preg_replace('/(.)./', '$1 ', $str);

点匹配一个角色。每隔一个字符用空格替换。

答案 1 :(得分:3)

首先你可以将你的计数器增加2,所以你不必检查它是否奇怪。 其次,因为字符串被视为char数组,您可以使用$str[$i]访问$ i位置的字符。

$str = "Hello World";
$newStr = $str;
for($i = 1; $i < strlen($str); $i += 2) {
  $newStr[$i] = ' ';
}
echo $newStr;

度过美好的一天。

[编辑]谢谢你提示提示。

答案 2 :(得分:2)

试试这个,比你的短一点但是你问的是单行。

$str    = 'helloworld';
$newStr = '';
for( $i = 0; $i < strlen( $str ); $i++) { $newStr .= ( ( $i % 2 ) == 0 ? $str[ $i ] : ' ' ); }
echo $newStr;

答案 3 :(得分:1)

类似但使用生成器

$str = 'helloworld';
$newstr ='';
foreach(range($str, strlen($str)-1, 2) as $i){
$newstr.=$str[$i].' ';
}

答案 4 :(得分:0)

我认为正则表达式技术是最干净的,但为了对比,我将展示更多。

  1. preg_replace()提供最简洁,单一功能的呼叫解决方案。该模式使用\K元字符来消除对捕获组的需要(捕获组会花费额外的“步骤”,因此在合理时应避免使用它们)。 \K表示忘记所有先前匹配的字符,然后从字符串中的这一点重新开始“全字符串匹配”。换句话说,它使用奇数字符(根据OP的“奇数|偶数”定义),然后丢弃它们,然后匹配接下来出现的任何单字节字符。

  2. 在我的一组技术中,最费力的是,多功能方法将输入字符串拆分为最多包含2个字符的字符串数组,然后,如果子字符串具有第二个字符,则将其替换为空格在重新附加到重建的字符串之前。

  3. for循环可能是性能最佳的脚本,但不是立即可读的脚本类型(也就是说,有些人很难阅读正则表达式)。请注意,不要在每次迭代中调用strlen(),这一点很重要。为避免这种情况,请在循环之前或循环的第一个参数中缓存长度。

代码:(Demo

$str = "helloworld";

echo preg_replace('~.\K.~', ' ', $str);

echo "\n---\n";

echo array_reduce(str_split($str, 2), function($carry, $item) {
         return $carry . $item[0] . (isset($item[1]) ? ' ' : '');
     });

echo "\n---\n";

for ($offset = 1, $length = strlen($str); $offset < $length; $offset += 2) {
    $str[$offset] = ' ';
}
echo $str;

输出:

h l o o l 
---
h l o o l 
---
h l o o l