gpt4 book ai didi

php - 如何交替检查字符,如果是 X 则用 Y 替换?

转载 作者:可可西里 更新时间:2023-11-01 12:25:37 28 4
gpt4 key购买 nike

我有一个字符串,像这样:

$str ="it is a test string.";

// for more clarification

i t i s a t e s t s t r i n g .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

现在我需要检查所有是 4 (加上第一个字符)的倍数的字符。像这样:

1  => i
4 => i
8 => [space]
12 => t
16 => r
20 => .

现在,我需要将它们与 Y 比较 (Y 是一个变量(符号),例如 Y = 'r' 在这里)。所以我想用 X 替换 Y (X 也是一个变量(符号),例如 X = 'm' 在这里)。

所以,我想要这个输出:

it is a test stming.

这是我的解决方案:我可以使用一些 PHP 函数来实现:

  • strlen($str): 统计字符数(named $sum)
  • $sum/4:查找是 4 的倍数的字符
  • substr($str, 4,1):选择特定字符(命名为$char) {the 问题在这里
  • if ($char == 'r') {}:比较
  • str_replace('r','m',$char): 替换

然后将所有 $char 相互组合。


但我的解决方案有两个问题:

  1. substr() 不计算 [space] 字符 (正如我上面提到的)
  2. 组合字符有点复杂。 (需要做一些废料处理)

请问有什么解决办法吗?我喜欢使用 REGEX 来做到这一点,这可能吗?

最佳答案

可以只使用 simple regexcallback (添加 u flag 如果是 utf-8,s 以匹配换行符)。

$str = preg_replace_callback(['/^./', '/.{3}\K./'], function ($m) {
return $m[0] == "r" ? "m" : $m[0];
}, $str); echo $str;

See this demo at tio.run > 这是一个测试stming。

  • 第一个模式:^.任何第一个字符
  • 第二个模式:\K.{3}​​ 之后重置任意三个字符,只想检查第四个 .

要与匿名函数一起使用,需要 PHP >= 5.3。 Here is the workaround (demo) .


更新: @Mariano demonstrated in his very nice answer甚至可以用一个正则表达式替换。感谢您提供的基准测试揭示了 preg_replace_callback 解决方案的相当糟糕的性能。更高效variant without callback (但仍然有两种模式)。

$str = preg_replace(['/^r/', '/(?:...[^r])*...\Kr/'], 'm', $str);

我还包括了@revo's answer from 2017Mariano's benchmark and ran it on tio.run (100k 循环)。对于较新的 PHP 和 PCRE2,数字似乎略有变化,“no regex”导致 tio.run。


.NET 或现代浏览器 JS regex 中它也是 could be done like this通过可变长度的后视。

关于php - 如何交替检查字符,如果是 X 则用 Y 替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33730320/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com