繁体   English   中英

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

[英]Easiest way to replace all characters in even positions in a 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;

?>

但是有没有更简单的方法或内置函数中的一行可以完成此任务。

提前致谢 。

使用正则表达式很容易做到:

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

点与字符匹配。 每隔一个字符替换一个空格。

首先,您可以将计数器增加两个,因此不必检查它是否很奇怪。 其次,因为字符串被当作char数组对待,所以您可以使用$str[$i]在$ i位置访问char。

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

祝你今天愉快。

[编辑]感谢林戈的提示。

尝试一下,比您的短一点,但是按照您的要求是单线的。

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

相似但使用生成器

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

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

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

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

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

代码:( 演示

$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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM