2010-01-24 25 views
10

Làm cách nào để thay thế chuỗi con trong mẫu tìm thấy, nhưng để phần còn lại như vậy?php/regex: Cách thay thế một phần của mẫu tìm thấy, nhưng để phần còn lại như cũ?

(EDIT: Trường hợp thực sự là tất nhiên phức tạp hơn ví dụ dưới đây, tôi phải phù hợp với lần xuất hiện trong thẻ xml Đó là lý do tại sao tôi phải sử dụng regex.!)

Hãy nói rằng tôi muốn thay đổi lần xuất hiện của chữ "X" trong một từ tới chữ "Z".

Tôi muốn

aaXaa AAX XAA

để trở thành

aaZaa AAZ zaa

Tìm lần xuất hiện của từ đó "x" được không phải là một vấn đề, như sau:

[^ X \ s] X [^ \ s]

nhưng một preg_match bình thường thay thế các trận đấu hoàn thành, nơi tôi muốn bất cứ điều gì trong mô hình ngoại trừ "X" ở lại vì nó là .

Đó là cách tốt nhất để thực hiện điều này trong php?

+0

Regex của bạn sẽ không khớp với X ở cuối từ thứ hai. – soulmerge

+0

Tôi đang bối rối, không phải là một thay thế đơn giản làm chính xác những gì bạn yêu cầu? Thay thế mẫu phù hợp và để nguyên phần còn lại. –

+0

Xin lỗi vì cunfusing. Tôi phải sử dụng regex, ví dụ của tôi hơi quá đơn giản! – Cambiata

Trả lời

13

Nếu regex của bạn chỉ khớp với phần liên quan, sẽ không có vấn đề gì khi nó thay thế kết quả khớp hoàn chỉnh (như preg_replace('/X/', 'Z', $string)).

Nhưng nếu bạn cần regex để chứa bộ phận mà không nên được thay thế, bạn cần phải nắm bắt chúng và chèn chúng trở lại:

preg_replace('/(non-replace)X(restofregex)/', '$1Z$2', $string); 
+0

Cảm ơn bạn, Soulmerge! Chính xác những gì tôi cần! – Cambiata

+0

Tôi tìm thấy khi ghép một biến chuỗi giữa hai nhóm phù hợp, tôi đã phải đặt các số trong dấu ngoặc nhọn, như thế này '' $ {1} '. $ foo. '$ {2}' ', nếu không nó không hoạt động. Tại sao vậy? – Nate

1

Hãy thử điều này

<?php 
$string = 'The quick brown fox jumped over the lazy dog.'; 
$patterns[0] = '/quick/'; 
$patterns[1] = '/brown/'; 
$patterns[2] = '/fox/'; 
$replacements[2] = 'bear'; 
$replacements[1] = 'black'; 
$replacements[0] = 'slow'; 
echo preg_replace($patterns, $replacements, $string); 
?> 

Ví dụ trên sẽ ra :

The bear black slow jumped over the lazy dog. 
+0

Bạn cần phải sắp xếp các mảng trước khi gọi preg_replace, để các mẫu bên phải được thay thế bằng các giá trị đúng: ksort ($ patterns); ksort ($ thay thế); –

2

Nếu nó thực sự đơn giản như thay thế X wit h Z, bạn cũng có thể sử dụng str_replace(), đó là nhanh hơn so với sử dụng preg trong trường hợp này:

$sNew = str_replace("X", "Z", $sOld); 
+0

Tôi nhận được quan điểm của bạn, và trường hợp thực tế là tất nhiên phức tạp hơn. Tôi sẽ sử dụng nó để xử lý các thẻ không gian tên trong các tài liệu xml, vì vậy phải có regex thực sự cho việc này! – Cambiata

0

Bạn có thực sự phải sử dụng regex cho việc này?

$output = str_replace('X', 'Z', $input); 
Các vấn đề liên quan