2009-02-08 17 views
0

мне нужен совет по этому сниппетаRegEx: сопоставление и заменить ABC в "AB ABC D"

$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, так что нет подстроки А в матче

Снова благодаря

+0

В следующий раз, вы должны придумать реальный пример. :-) Приведенные примеры «ABC» не идеальны (как вы видели). – Tomalak

+0

Какой должен быть желаемый результат для «A AABCC C»? –

+0

@NoWhereMan: Можете ли вы объяснить, почему простой preg_replace ('| A (B) C |', 'foo $ 1bar', $ text) не работает? –

ответ

0

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

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); 
+0

A (. +?) C соответствует A C B C, а [^ C] не подходит, поскольку C на самом деле является строкой (например, это может быть «foo»); извините, я, вероятно, отредактировал описание, пока вы давали ответ –

+0

Я думаю, что это лучший, спасибо –

1

Как об этом:

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

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


После просмотра некоторых замечаний Op, я буду рисковать другую догадку:

$text = preg_replace('|A(B)C|', 'foo$1bar', $text); 
+0

Приятно, но мне также нужно было сопоставить белое пространство, я имел в виду ABC как произвольные строки A, B, C, я должен, вероятно, объяснить это лучше. –

1

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

$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text); 
+0

Я пробовал это, и он соответствует AABC в «AABC», и не только ABC –

+0

Справа, отредактирован, чтобы добавить жадный матч в начале. – kmkaplan