Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在一根线中的一根针后更换?_Php_Regex_String_Search_Replace - Fatal编程技术网

Php 在一根线中的一根针后更换?

Php 在一根线中的一根针后更换?,php,regex,string,search,replace,Php,Regex,String,Search,Replace,我有一根绳子,类似于 bbbbbbbcccc 对于我来说,有没有什么方法可以用PHP将仅有一个字母“a”之后的所有字母“b”替换为“c”,而不必拆分字符串 BBBBACCCCCC 奇怪的问题 echo preg_replace('/a(.*)$/e', "'a'.strtr($1, 'b', 'c')", 'bbbabbbbbccccc'); preg_replace将“a”右侧的所有内容与regex匹配。正则表达式中的e修饰符将替换字符串计算为代码。替换字符串中的代码使用strtr()将“b

我有一根绳子,类似于

bbbbbbbcccc

对于我来说,有没有什么方法可以用PHP将仅有一个字母“a”之后的所有字母“b”替换为“c”,而不必拆分字符串

BBBBACCCCCC

奇怪的问题

echo preg_replace('/a(.*)$/e', "'a'.strtr($1, 'b', 'c')", 'bbbabbbbbccccc');

preg_replace将“a”右侧的所有内容与regex匹配。正则表达式中的e修饰符将替换字符串计算为代码。替换字符串中的代码使用strtr()将“b”替换为“c”。

这里有三个选项

首先是分裂。是的,我知道你不想分裂

$string = 'bbbbabbbbbccccc';
$parts = preg_split('/(a)/', $string, 2, PREG_SPLIT_DELIM_CAPTURE);
// Parts now looks like:
// array('bbb', 'a', 'bbbbcccc');
$parts[2] = str_replace('b', 'c', $parts[2]);
$correct_string = join('', $parts);
第二,位置搜索和子字符串替换

$string = 'bbbbabbbbbccccc';
$first_a_index = strpos($string, 'a');
if($first_a_index !== false) {
// Now, grab everything from that first 'a' to the end of the string.
    $replaceable = substr($string, $first_a_index);
// Replace it.
    $replaced = str_replace('b', 'c', $replaceable );
// Now splice it back in
    $string = substr_replace($string, $replaced, $first_a_index);
}
第三,我本来打算发布一个正则表达式,但也一样好

为了清晰起见,这些代码示例非常详细,可以简化为一行或两行;
$s = 'bbbbabbbbbccccc';
echo preg_replace('/((?:(?!\A)\G|(?<!a)a(?!a))[^b]*)b/', '$1c', $s);
echo preg_replace('/(?:(?!\A)\G(?(!\A)以防止它

(?匹配一个
a
,该
a
既不在
a
前面也不在后面。
a
在组1中捕获,因此我们可以用
$1
将其插入替换项中

这是一个“纯正则表达式”解决方案,这意味着它只需调用
preg\u replace
即可完成全部工作,并且不依赖嵌入式代码和
/e
修饰符。如果您发现自己在这些约束条件下工作,最好知道这一点,但这绝对不应该是您的第一选择