2013-08-02 2 views
7

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

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

Пример

от

abcdefghij 

к

a8bcde8fghi8j 


Вопрос

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

// input string 
$in = 'abcdefghij'; 

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

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

ответ

18

Решение заключается в обертывании обратной ссылки в ${}.

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

, которые будут выводить a8bcde8fghi8j

См the manual на этом особом случае с обратными ссылками.

+2

Thanks; Я должен RTFM, прежде чем спрашивать в следующий раз. – MightyPork

+0

Хорошо. Просто обещайте не сдаваться, задавая правильные вопросы (например, этот). Мы учимся на допросах, и на этот раз, я думаю, вы получили ответ в 10 раз быстрее, чем пробная ошибка. Кто-то обязательно должен знать решение ...;) –

+0

Собственно, после публикации я пошел на php.net и * нашел ответ *. Я уже писал собственный ответ, когда вы избавили меня от стыда отвечать на него сам;) – MightyPork

4

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

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

Here is a relevant quote from the docs regarding backreference:

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