preg_replace, как заменить только соответствующий шаблон xxx ($ 1) yyy внутри селектора - PullRequest
27 голосов
/ 04 февраля 2011

Я пытаюсь использовать регулярное выражение, чтобы удалить только соответствующую часть строки. Я использую функцию preg_replace и пытался удалить соответствующий текст, поместив скобки вокруг соответствующей части. Пример:

preg_replace('/text1(text2)text3/is','',$html);

Это заменяет всю строку на '' хотя. Я только хочу стереть текст2, но оставить текст1 и текст3 нетронутыми. Как я могу сопоставить и заменить только ту часть строки, которая соответствует?

Ответы [ 4 ]

39 голосов
/ 04 февраля 2011

Существует альтернатива использованию text1 и text3 в шаблоне сопоставления и последующему их повторному вводу через строку замены. Вы можете использовать утверждения , например:

preg_replace('/(?<=text1)(text2)(?=text3)/', "", $txt);

Таким образом, регулярное выражение ищет только наличие , но не учитывает две строки при применении замены.

http://www.regular -expressions.info / lookaround.html для получения дополнительной информации.

36 голосов
/ 04 февраля 2011

Используйте обратные ссылки (т.е. в скобках), чтобы сохранить только те части выражения, которые вы хотите запомнить. Вы можете вызвать содержимое строки замены, используя $1, $2 и т. Д.:

preg_replace('/(text1)text2(text3)/is','$1$2',$html);
12 голосов
/ 04 февраля 2011

Попробуйте это:

$text = preg_replace("'(text1)text2(text3)'is", "$1$2", $text);

Надеюсь, что это работает!

Редактировать: изменено \\1\\2 на $1$2, что является рекомендуемым способом.

0 голосов
/ 04 февраля 2011

Самым простым способом было упомянуто несколько типов.Другая идея - предвкушение / оглядка назад, на этот раз они излишни, но часто весьма полезны.

...