У меня есть строка, что-то вродеЗаменить после иглы в строке?
bbbbabbbbbccccc
Есть ли способ для меня, чтобы заменить все буквы «б» после только одной буквы «а» в «с», не имея разбить строку, используя PHP?
bbbbacccccccccc
У меня есть строка, что-то вродеЗаменить после иглы в строке?
bbbbabbbbbccccc
Есть ли способ для меня, чтобы заменить все буквы «б» после только одной буквы «а» в «с», не имея разбить строку, используя PHP?
bbbbacccccccccc
странный вопрос.
echo preg_replace('/a(.*)$/e', "'a'.strtr($1, 'b', 'c')", 'bbbabbbbbccccc');
preg_replace соответствует всем, что находится справа от 'a', с регулярным выражением. модификатор 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);
}
В-третьих, я собирался отправить регулярное выражение, но the one dqhendricks posted так же хорошо.
Эти примеры кода являются подробными для ясности и могут быть сведены к одно- или двухстрочным.
$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
. Хорошо знать, если вы когда-нибудь окажетесь в рамках этих ограничений, но это определенно не должно быть вашим первым курортом.
Почему бы не разделить строку? – Amber