2012-05-09 58 views
8

Tôi có một chuỗi đó là như thế nàyThay thế tất cả các lần xuất hiện bên mẫu

{{ some text @ other text @ and some other text }} @ this should not be replaced {{ but this should: @ }} 

tôi muốn nó trở thành

{{ some text ### other text ### and some other text }} @ this should not be replaced {{ but this should: ### }} 

Tôi đoán ví dụ này là thẳng về phía trước đủ và tôi không chắc tôi tốt hơn có thể giải thích những gì tôi muốn đạt được bằng lời nói.

Tôi đã thử nhiều cách tiếp cận khác nhau nhưng không có cách nào khác.

Trả lời

8

này có thể đạt được với một biểu thức chính quy gọi trở lại một chuỗi đơn giản thay thế:

function replaceInsideBraces($match) { 
    return str_replace('@', '###', $match[0]); 
} 

$input = '{{ some text @ other text @ and some other text }} @ this should not be replaced {{ but this should: @ }}'; 
$output = preg_replace_callback('/{{.+?}}/', 'replaceInsideBraces', $input); 
var_dump($output); 

tôi đã chọn cho một biểu thức chính quy không tham lam đơn giản để tìm niềng răng của bạn, nhưng bạn có thể chọn để thay đổi này cho hiệu suất hoặc phù hợp với nhu cầu của bạn.

chức năng Anonymous sẽ cho phép bạn parameterise thay thế của bạn:

$find = '@'; 
$replace = '###'; 
$output = preg_replace_callback(
    '/{{.+?}}/', 
    function($match) use ($find, $replace) { 
     return str_replace($find, $replace, $match[0]); 
    }, 
    $input 
); 

Tài liệu: http://php.net/manual/en/function.preg-replace-callback.php

2

Bạn có thể làm điều đó với 2 regex. Người đầu tiên chọn tất cả văn bản giữa {{}} và văn bản thứ hai thay thế @ bằng ###. Sử dụng 2 regexes thể được thực hiện như thế này:

$str = preg_replace_callback('/first regex/', function($match) { 
    return preg_replace('/second regex/', '###', $match[1]); 
}); 

Bây giờ bạn có thể làm cho regex thứ nhất và thứ hai, hãy thử cho mình và nếu bạn không nhận được nó, hỏi nó trong câu hỏi này.

2

phương pháp khác là sử dụng regex (\{\{[^}]+?)@([^}]+?\}\}). Bạn sẽ cần phải chạy qua nó một vài lần để phù hợp với nhiều @ s bên {{ niềng răng }}:

<?php 

$string = '{{ some text @ other text @ and some other text }} @ this should not be replaced {{ but this should: @ }}'; 
$replacement = '#'; 
$pattern = '/(\{\{[^}]+?)@([^}]+?\}\})/'; 

while (preg_match($pattern, $string)) { 
    $string = preg_replace($pattern, "$1$replacement$2", $string); 
} 

echo $string; 

Những kết quả đầu ra:

{{một số văn bản ### văn bản kháC### và một số văn bản khác}} @ điều này nên không được thay thế {{nhưng điều này nên: ###}}

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