一根针在一根绳子后更换?

时间:2011-01-15 06:47:51

标签: php regex string search replace

我有一个字符串,类似

  

bbbbabbbbbccccc

有没有办法让我在“c”中将所有字母“b”替换成“c”而不必使用PHP来分割字符串?

  

bbbbacccccccccc

3 个答案:

答案 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)匹配aa既不在a之前也不在其后面。在{1}组中捕获了$1,因此我们可以使用preg_replace将其重新插入到替换中。

这是一个“纯正则表达式”解决方案,这意味着它只需调用/e即可完成整个工作,并且不依赖于嵌入式代码和{{1}}修饰符。如果您发现自己在这些限制范围内工作,那将是很好的,但它绝对不应该是您的第一手段。