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

9
$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个回答

10

使用正则表达式很容易实现:

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

点(.)匹配一个字符。每隔一个字符将其替换为一个空格。


这将匹配空格和空白字符 - krasipenkov
2
@krasipenkov,是的,而且OP没有提到任何有关空格的事情。因此,该解决方案仍然满足问题中描述的条件。 - Ruslan Osmanov
2
到目前为止,这篇文章的最佳答案。 - Beginner

3

首先,您可以使计数器增加两个,这样就不必检查它是否是奇数。 其次,由于字符串被视为字符数组,因此您可以使用$str[$i]访问位置$i处的字符。

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

祝您有美好的一天。

[编辑] 感谢ringo的提示。


或者先复制*$str*,但这就是思路。 - Déjà vu

2

试一试这个,比你的代码短一点,但是像你要求的那样只有一行。

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

2
称其为“一行代码”可能有点牵强! - aaaidan
@aaaidan,感谢您的建设性评论,正是我今天早上所需要的。还有其他的经验之谈吗? - Blinkydamo
1
抱歉,不是有意冒犯。希望你有愉快的一天。 :) - aaaidan

1
类似但使用生成器的内容。
$str = 'helloworld';
$newstr ='';
foreach(range($str, strlen($str)-1, 2) as $i){
$newstr.=$str[$i].' ';
}

0

我认为正则表达式技术会更加简洁,但是为了对比,我将展示几种其他方法。

  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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接