RegExp для поиска фрагмента где-то между другими двумя

Qwerty

Новичок
RegExp для поиска фрагмента где-то между другими двумя

Как записать такое условие?
Найти A, встречающеся только где-то между B и C.
Например, найти выделенное:
__A___B__A__AC__A_B__A_C__
Ну, и, грубо говоря, заменить на D.

Вроде просто должно быть, но не получается...
 

sage

Новичок
PHP:
preg_match_all('~B.*A.*C~Ui', '__A___B__A__AC__A_B__A_C__', $matches, PREG_SET_ORDER);
print_r($matches);
 

Qwerty

Новичок
В результатах поиска должны быть только A...
А что значит флаг U в конце выражения?
 

Qwerty

Новичок
Не, да не выйдет так. :)
Нужно что-то вроде (?=...) и (?<=...) использовать, чтобы B и C не включались в результат поиска. Но php выдает ошибку типа: Compilation failed: lookbehind assertion is not fixed length at ...
Да, и к тому же, мне нужно найти обе A, заключенные между первыми B и C.
Может использовать такую конструкцию для проб, как раз то, что нужно получить в результате.
PHP:
echo preg_replace("...","D","__A___B__A__AC__A_B__A_C__");
А насчет U, не понимаю его предназначения, жадность вроде нормально регулизуется символом "?".
 

Qwerty

Новичок
Про U понятно, инверсия условий жадности. Спасибо за ссылки на документацию, но проблема не решилась. Мало того, в результате опытов появилась еще одна, опубликую позже отдельной темой...
 

zarus

Хитрожопый макак
PHP:
$test = '__A___B__A__AC__A_B__A_C__';
if (preg_match_all('/B(.*?A.*?)C/msi',$test,$matches,PREG_SET_ORDER)) {
  foreach ($matches as $match) {
    if (preg_match_all('/(А)/msi',$match[1],$final_match,PREG_SET_ORDER)) {
      print_r($final_match);
      echo '<br />';
    }
  }
}
-~{}~ 16.12.05 14:13:

Модификаторы m s i не обязательны, что каждый из них означает - в мануале описано.
 

Qwerty

Новичок
Хм, ну и как это использовать для замены на A на D?

P.S. A, B, C и D могут быть не одиночными символами.
 

Dreammaker

***=Ф=***
[m]preg_replace_callback[/m]

Может поможет. Вырезаем все что между В и С str_replace заменяем A на D пользуемся :)
 
Сверху