2011-01-15 4 views
1

У меня есть строка, что-то вродеЗаменить после иглы в строке?

bbbbabbbbbccccc

Есть ли способ для меня, чтобы заменить все буквы «б» после только одной буквы «а» в «с», не имея разбить строку, используя PHP?

bbbbacccccccccc

+2

Почему бы не разделить строку? – Amber

ответ

1

странный вопрос.

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

preg_replace соответствует всем, что находится справа от 'a', с регулярным выражением. модификатор e в регулярном выражении оценивает заменяющую строку как код. код в заменяющей строке использует strtr(), чтобы заменить «b» на «c».

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 так же хорошо.

Эти примеры кода являются подробными для ясности и могут быть сведены к одно- или двухстрочным.

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. Хорошо знать, если вы когда-нибудь окажетесь в рамках этих ограничений, но это определенно не должно быть вашим первым курортом.

Смежные вопросы