我有一个字符串,类似
bbbbabbbbbccccc
有没有办法让我在“c”中将所有字母“b”替换成“c”而不必使用PHP来分割字符串?
bbbbacccccccccc
答案 0 :(得分:1)
echo preg_replace('/a(.*)$/e', "'a'.strtr($1, 'b', 'c')", 'bbbabbbbbccccc');
preg_replace使用正则表达式匹配'a'右侧的所有内容。正则表达式中的e修饰符将替换字符串作为代码进行评估。替换字符串中的代码使用strtr()将'b'替换为'c'。
答案 1 :(得分:1)
以下是三个选项。
首先,分裂。是的,我知道你希望不分裂。
$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);
}
第三,我打算发布正则表达式,但the one dqhendricks posted同样好。
为清晰起见,这些代码示例冗长,可以缩减为一行或两行。
答案 2 :(得分:1)
$s = 'bbbbabbbbbccccc';
echo preg_replace('/((?:(?!\A)\G|(?<!a)a(?!a))[^b]*)b/', '$1c', $s);
\G
匹配上一场比赛结束的位置。在第一次匹配尝试时,\G
匹配字符串的开头,如\A
。我们不希望如此,因此我们使用(?!\A)
来阻止它。
(?<!a)a(?!a)
匹配a
,a
既不在a
之前也不在其后面。在{1}组中捕获了$1
,因此我们可以使用preg_replace
将其重新插入到替换中。
这是一个“纯正则表达式”解决方案,这意味着它只需调用/e
即可完成整个工作,并且不依赖于嵌入式代码和{{1}}修饰符。如果您发现自己在这些限制范围内工作,那将是很好的,但它绝对不应该是您的第一手段。