Регулярное выражение:сопоставление и замена ABC в “AB ABC D”

StackOverflow https://stackoverflow.com/questions/525681

  •  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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top