Я пытаюсь заменить все вхождения « a » на « b » внутри некоторой строки. Проблема в том, что мне нужно заменить только те буквы, которые находятся внутри скобок:
asd asd asd [asd asd asd] asd asd asd
- HTML-таблица для массива PHP
 - Найти несколько шаблонов с помощью одного preg_match_all в PHP
 - Как правильно избежать обратного слэша, чтобы соответствовать буквальной обратной косой чертой в шаблонах регулярных выражений с одним кавычком и двойным кавычком
 - Поиск php mongodb '$ или' regex
 - Заменить все кавычки, которые не указаны в html-тегах
 
На данный момент у меня есть этот код:
$what = '/(?<=\[)a(?=.*?\])/s'; $with = 'b'; $where = 'asd asd asd [asd asd asd] asd asd asd'; 
Но он заменяет только первый «а», и я получаю этот результат:
asd asd asd [bsd asd asd] asd asd asd
Я действительно должен сделать это только с одним вызовом preg_replace.
  Вы не можете сделать это с помощью одного вызова preg_replace потому что lookbehind должен будет сказать «есть квадратная скобка открытия где-то перед матчем», и это невозможно, так как шаблоны lookbehind должны иметь фиксированную длину. 
  Зачем вам это нужно в любом случае?  Это можно сделать довольно легко с помощью preg_replace_callback , где вы бы соответствовали группам содержимого внутри квадратных скобок и каждый раз использовали preg_replace в матче (или просто просто str_replace если все, что вы собираетесь делать, это заменить «a» на «b»). 
Пример:
 $what = '/\[([^]]*)\]/'; $where = 'asd asd asd [asd asd asd] asd asd asd'; echo preg_replace_callback( $what, function($match) { return '['.str_replace('a', 'b', $match[1]).']'; }, $where); 
Попробуйте это (это то, что точно объяснил Джон)
 function replace_a_with_b($matches) { return str_replace("a", "b", $matches[0]); } $text = 'asd asd asd [asd asd asd] asd asd asd'; echo preg_replace_callback("#(\[[^]]+\])#", "replace_a_with_b", $text); 
Вывод:
 asd asd asd [bsd bsd bsd] asd asd asd