2013-08-02 15 views
7

Sytuacjapreg_replace: dodaj numer po odwołaniem wstecznym

chcę użyć preg_replace() dodać cyfrę '8' po każdym [aeiou].

Przykład

z

abcdefghij 

do

a8bcde8fghi8j 


Pytanie

Jak mam napisać ciąg zastępczy?

// input string 
$in = 'abcdefghij'; 

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

To tylko przykład, więc sugeruje str_replace() jest nie prawidłową odpowiedź.
Chcę wiedzieć, jak uzyskać numer po odwołaniu zwrotnym w ciągu zastępowania.

Odpowiedz

18

Rozwiązaniem jest zawinięcie referencji zwrotnej w ${}.

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

który będzie wyjście a8bcde8fghi8j

Zobacz the manual w tym szczególnym przypadku z wstecznych.

+2

Dzięki; Powinienem RTFM przed pytaniem następnym razem. – MightyPork

+0

Ok. Obiecaj nie rezygnować z zadawania prawidłowych pytań (takich jak ten). Uczymy się przez zadawanie pytań, i tym razem, myślę, że masz odpowiedź 10 razy szybszą niż metodą prób i błędów. Ktoś jest zobowiązany znać rozwiązanie ...;) –

+0

W rzeczywistości po wysłaniu go poszedłem do php.net i * znalazłem odpowiedź *. Już pisałem własną odpowiedź, gdy oszczędziłeś mi wstydu, że sam jej odpowiedziałem;) – MightyPork

4

Można to zrobić:

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

Here is a relevant quote from the docs regarding backreference:

Podczas pracy z wzorem zastępczej gdzie wsteczne jest natychmiast następuje przez inny numer (tj umieszczając numer dosłownego natychmiast po dopasowane wzór), nie możesz użyć znanej \ 1 notacji dla swojej referencji zwrotnej. \ 11, na przykład, zmyliłoby preg_replace(), ponieważ nie wie, czy chcesz uzyskać \ 1 referencję zwrotną, po której następuje literalna 1, lub \ 11 wsteczna relacja, po której następuje nic. W takim przypadku rozwiązaniem jest użycie \ $ {1} 1. Tworzy to izolowaną referencję zwrotną w wysokości 1 $, pozostawiając 1 jako literał.