Регулярное выражение:сопоставление и замена ABC в “AB ABC D”
-
22-08-2019 - |
Вопрос
Мне нужен совет по этому фрагменту
$text = preg_replace('|(A.*)?A(.*)C|', '$1foo$2bar', $text);
Это будет соответствовать ABC в "AB ABC D" и заменит его на "AB fooBbar D".;как вы можете видеть, это также соответствует части "AB" в начале, которую я должен повторить в строке замены с $ 1, чтобы не потерять ее.
Это лучший способ получить такой результат?
Существует ли флаг X такой , что
$text = preg_replace('|A(.*)C|X', 'foo$1bar', $text);
приводит к тому же результату?
Надеюсь, я ясно выразился
Спасибо!
Редактировать:Рассматривайте A, B, C как атомарные строки произвольных символов, они также могут содержать пробелы
Кроме того, представленный пример на самом деле содержит ошибки, поскольку он соответствует только второму "ABC" в "ABC ABC".
РЕДАКТИРОВАТЬ 2:Извините, я, вероятно, очень плохо объяснил проблему.Дело в том, что я бы хотел соответствовать неважно находится между двумя строками A,C, так что в совпадении нет подстроки A
Еще раз спасибо
Решение
Поскольку вопрос был прояснен, попробуйте это выражение:
preg_replace('/(?:A)+(.+?)(?:C)+/', 'foo$1bar', $text)
Пример:
$A = 'abc'; $B = '123'; $C = 'xyz';
$text = "$A$B$C $A$A$B$C $A$B$C$C";
echo preg_replace("/(?:$A)+(.+?)(?:$C)+/", 'foo$1bar', $text);
Другие советы
Как насчет этого:
$text = preg_replace('|A(\S*)C|', 'foo$1bar', $text);
В \S
соответствует символу, не содержащему пробелов, поэтому вы не будете заменять разные слова.
Увидев некоторые комментарии OP, я рискну высказать еще одно предположение:
$text = preg_replace('|A(B)C|', 'foo$1bar', $text);
Используйте нежадную версию *
квантификатор :
$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text);