Заменить после иглы в веревочке? - PullRequest
1 голос
/ 15 января 2011

У меня есть строка, что-то вроде

bbbbabbbbbccccc

Можно ли как-нибудь заменить все буквы "b" после единственной буквы "a" на "c", не разбивая строку, используя PHP?

bbbbacccccccccc

Ответы [ 3 ]

1 голос
/ 15 января 2011

Вот три варианта.

Сначала разделение.Да, я знаю, вы хотите сделать это без разделения.

$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);
}

В-третьих, я собирался опубликовать регулярное выражение, но один из опубликованных dqhendricks также хорош.

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

1 голос
/ 15 января 2011
$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 голос
/ 15 января 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...