2012-02-23 31 views
14
$string = ":abc and :def have apples."; 
$replacements = array('Mary', 'Jane'); 

nên trở thành:preg_replace với thay thế mảng

Mary and Jane have apples. 

Ngay bây giờ tôi đang làm nó như thế này:

preg_match_all('/:(\w+)/', $string, $matches); 

foreach($matches[0] as $index => $match) 
    $string = str_replace($match, $replacements[$index], $string); 

Tôi có thể làm điều này trong một hoạt động đơn lẻ, sử dụng một cái gì đó giống như preg_replace ?

+1

[này] (http://codepad.org/KfP3g02m) là cách bạn có thể làm điều đó với một mảng kết hợp. – Teneff

Trả lời

10

Bạn có thể sử dụng preg_replace_callback với một callback mà tiêu thụ thay thế của bạn một sau khi khác:

$string = ":abc and :def have apples."; 
$replacements = array('Mary', 'Jane'); 
echo preg_replace_callback('/:\w+/', function($matches) use (&$replacements) { 
    return array_shift($replacements); 
}, $string); 

Output:

Mary and Jane have apples. 
+0

công cụ sửa đổi điện tử đã bị khấu hao theo PHP v.5.5 – Kareem

+1

@Karim: Phải, đã xóa nó khỏi câu trả lời. Cảm ơn con trỏ. – hakre

8
$string = ":abc and :def have apples."; 
$replacements = array('Mary', 'Jane'); 

echo preg_replace("/:\\w+/e", 'array_shift($replacements)', $string); 

Output:

Mary and Jane have apples. 
+0

Điều này sẽ không hoạt động trên HHVM bất kỳ cách giải quyết nào? – Mario

3

Đối với một Multipl e và thay thế Full mảng bởi Associative chính bạn có thể sử dụng để phù hợp với mô hình regex của bạn:

$words=array("_saudation_"=>"Hello", "_animal_"=>"cat", "_animal_sound_"=>"MEooow"); 
    $source=" _saudation_! My Animal is a _animal_ and it says _animal_sound_ ... _animal_sound_ , _no_match_"; 


    function translate_arrays($source,$words){ 
    return (preg_replace_callback("/\b_(\w*)_\b/u", function($match) use ($words) { if(isset($words[$match[0]])){ return ($words[$match[0]]); }else{ return($match[0]); } }, $source)); 
    } 


    echo translate_arrays($source,$words); 
    //returns: Hello! My Animal is a cat and it says MEooow ... MEooow , _no_match_ 

* Chú ý, thats mặc dù "_no_match_" thiếu dịch, nó sẽ phù hợp trong regex, nhưng bảo tồn quan trọng của nó. Và các phím có thể lặp lại nhiều lần.

+0

Tôi khuyên bạn nên thêm công cụ sửa đổi "u" vào regex để hỗ trợ chuỗi UTF-8: '/ \ b _ (\ w *) _ \ b/u'. BTW, mã ở trên có lỗi cú pháp và dấu ngoặc đơn thêm ở cuối. – nikoskip

+0

Có vẻ như không có vấn đề thêm dấu ngoặc đơn, tôi đã xác minh mã và đang chạy ok. BUt i đã thêm UTf-8. Cảm ơn bạn – Miguel

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