preg_replace (), кажется, удаляет все слово вместо его части - PullRequest
0 голосов
/ 09 января 2012

Я пытаюсь сопоставить определенное слово и заменить часть слова определенным текстом, но оставшаяся часть слова остается без изменений.Насколько я понимаю, добавление скобок к части шаблона регулярных выражений означает, что соответствие шаблона в скобках заменяется, когда вы используете preg_replace()

для целей тестирования, которые я использовал:

$text = 'batman';
echo $new_text = preg_replace('#(bat)man#', 'aqua', $text);

Я только хочу, чтобы «летучая мышь» была заменена на «аква», чтобы получить «аквамен».Вместо этого $new_text повторяет 'aqua', оставляя часть 'man'.

Ответы [ 4 ]

5 голосов
/ 09 января 2012

preg_replace заменяет всю строку, совпадающую с регулярным выражением

$text = 'batman';
echo $new_text = preg_replace('#bat(man)#', 'aqua\\1', $text);

Вместо этого захватите man и добавьте его к aqua префиксу

Другой способ сделать это - использовать утверждения:

$text = 'batman';
echo $new_text = preg_replace('#bat(?=man)#', 'aqua', $text);
3 голосов
/ 09 января 2012

Я бы не использовал для этого функции preg_*, а просто сделал бы str_replace() DOCs :

echo str_replace('batman', 'aquaman', $text);

Это проще, так как в этом случае регулярное выражение на самом деле не нужно. В противном случае это было бы с регулярным выражением:

echo $new_text = preg_replace('#bat(man)#', 'aqua\\1', $text);

Это заменит ваш man после aqua при замене всей поисковой фразы. preg_replace DOC заменяет всю совпадающую часть шаблона.

2 голосов
/ 09 января 2012

То, как вы пытаетесь это сделать, было бы больше похоже на:

preg_replace('#bat(man)#', 'aqua$1', $text);

Я бы использовал позитивный взгляд :

preg_replace('/bat(?=man)/', 'aqua', $text)

Демо здесь: http://ideone.com/G9F4q

1 голос
/ 09 января 2012

Скобки создают группу захвата, это означает, что вы можете получить доступ к части, соответствующей этой группе, используя \1.

Вы можете сделать либо то, что предложили zerkms, либо использовать запрос, который просто проверяет, но не совпадает.

$text = 'batman';
echo $new_text = preg_replace('#bat(?=man)#', 'aqua', $text);

Это будет соответствовать "летучей мыши", но только если за ней следует "человек", и только "летучая мышь" заменяется.

...