RegEx: сопоставление и замена ABC в "AB ABC D" - PullRequest
0 голосов
/ 08 февраля 2009

Мне нужен совет по этому фрагменту

$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".

EDIT2 : Извините, я, наверное, очень плохо объяснил проблему. Суть в том, что я бы хотел сопоставить с любым между двумя строками A, C, чтобы в совпадении не было подстроки A

Еще раз спасибо

Ответы [ 3 ]

1 голос
/ 08 февраля 2009

Используйте не жадную версию квантификатора *:

$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text);
1 голос
/ 08 февраля 2009

Как насчет этого:

$text = preg_replace('|A(\S*)C|', 'foo$1bar', $text);

\S соответствует непробельному символу, поэтому вы не будете заменять другие слова.


После просмотра некоторых комментариев ОП я рискну предположить еще раз:

$text = preg_replace('|A(B)C|', 'foo$1bar', $text);
0 голосов
/ 08 февраля 2009

Поскольку вопрос прояснился, попробуйте это выражение:

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);
...