2013-08-02 24 views
7

Tình hìnhpreg_replace: thêm số sau backreference

Tôi muốn sử dụng preg_replace() để thêm một chữ số '8' sau mỗi [aeiou].

Ví dụ

từ

abcdefghij 

để

a8bcde8fghi8j 


Câu hỏi

Tôi nên viết chuỗi thay thế bằng cách nào?

// input string 
$in = 'abcdefghij'; 

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

Đây là chỉ là ví dụ, vì vậy đề nghị str_replace()không một câu trả lời hợp lệ.
Tôi muốn biết làm thế nào để có số sau backreference trong chuỗi thay thế.

Trả lời

18

Giải pháp là bọc phần sau vào ${}.

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

mà sẽ ra a8bcde8fghi8j

Xem the manual về trường hợp đặc biệt này với backreferences.

+2

Cảm ơn; Tôi nên RTFM trước khi hỏi lần sau. – MightyPork

+0

Ok. Chỉ cần hứa sẽ không từ bỏ việc đặt câu hỏi hợp lệ (như câu hỏi này). Chúng ta học bằng cách đặt câu hỏi, và lần này, tôi đoán bạn có câu trả lời gấp 10 lần so với thử và lỗi. Ai đó nhất định biết giải pháp ...;) –

+0

Như một vấn đề của thực tế, sau khi đăng nó tôi đã đi đến php.net, và * tìm thấy câu trả lời *. Tôi đã viết câu trả lời của chính mình khi bạn tha cho tôi sự xấu hổ khi tự trả lời nó;) – MightyPork

4

Bạn có thể làm điều này:

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

Here is a relevant quote from the docs regarding backreference:

Khi làm việc với một mô hình thay thế nơi một backreference được ngay lập tức sau đó một số khác (ví dụ: đặt một số chữ ngay sau khi một mô hình phù hợp), bạn không thể sử dụng ký hiệu quen thuộc \ 1 cho backreference của mình. \ 11, ví dụ, sẽ gây nhầm lẫn với preg_replace() vì nó không biết bạn có muốn \ 1 backreference theo sau là chữ 1 hay ngược lại không có gì. Trong trường hợp này, giải pháp là sử dụng \ $ {1} 1. Điều này tạo ra một backreference $ 1 bị cô lập, để lại 1 như là một chữ.

Các vấn đề liên quan