preg_replace: добавить номер после обратной ссылки

Ситуация

Я хочу использовать preg_replace() для добавления цифры '8' после каждого [aeiou].

Пример

от

abcdefghij

to

a8bcde8fghi8j


Вопрос

Как мне написать заменяющую строку?

// input string
$in = 'abcdefghij';

// this obviously won't work ----------↓
$out = preg_replace( '/([aeiou])/', '\18',  $in);

Это просто пример, поэтому предложение str_replace() не верный ответ.
Я хочу знать, как иметь число после обратной ссылки в строке замены.


person MightyPork    schedule 02.08.2013    source источник


Ответы (2)


Решение состоит в том, чтобы обернуть обратную ссылку в ${}.

$out = preg_replace( '/([aeiou])/', '${1}8',  $in);

который выведет a8bcde8fghi8j

См. руководство по этому особому случаю с обратными ссылками.

person Aron Cederholm    schedule 02.08.2013
comment
Спасибо; Я должен RTFM, прежде чем спрашивать в следующий раз. - person MightyPork; 03.08.2013
comment
Ok. Просто пообещайте не отказываться от правильных вопросов (например, этого). Мы учимся, задавая вопросы, и на этот раз, полагаю, вы получили ответ в 10 раз быстрее, чем методом проб и ошибок. Кто-то обязательно знает решение ...;) - person Aron Cederholm; 03.08.2013
comment
Собственно говоря, после публикации я зашел на php.net и нашел ответ. Я уже писал свой ответ, когда ты избавил меня от стыда отвечать на него сам;) - person MightyPork; 03.08.2013
comment
Обратите внимание на одинарные кавычки. "${1}8" не работает, потому что строки в двойных кавычках анализируются / интерпретируются в php, и поэтому фигурные скобки исчезают до того, как строка будет передана в функцию. - person Mr Tsjolder; 22.09.2016

Ты можешь сделать это:

$out = preg_replace('/([aeiou])/', '${1}' . '8', $in);

Вот соответствующая цитата из документов относительно обратной ссылки:

При работе с шаблоном замены, где за обратной ссылкой сразу же следует другое число (т. Е. Размещение буквального числа сразу после согласованного шаблона), вы не можете использовать знакомую нотацию \ 1 для своей обратной ссылки. \ 11, например, запутает preg_replace (), поскольку он не знает, хотите ли вы, чтобы обратная ссылка \ 1 сопровождалась литералом 1, или обратная ссылка \ 11, за которой не следовало ничего. В этом случае решение состоит в том, чтобы использовать \ $ {1} 1. Это создает изолированную обратную ссылку на $ 1, оставляя 1 как литерал.

person jh314    schedule 03.08.2013