2012-05-09 7 views
8

ich eine Zeichenfolge, die wie dieserErsetzen Sie alle Vorkommen innerhalb Muster

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

ich will es werden

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

Ich denke, das Beispiel geradlinig genug ist, und ich bin nicht sicher, ob ich kann besser erklären, was ich in Worten erreichen will.

Ich versuchte mehrere verschiedene Ansätze, aber keiner arbeitete.

Antwort

8

Dies kann mit einem regulären Ausdruck Rückruf auf einen einfachen String ersetzen erreicht werden:

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); 

Ich habe für einen einfachen nicht-gierigen regulären Ausdruck entscheiden Ihre Zahnspange zu finden, aber Sie können wählen, dies zu ändern, für Leistung oder nach Ihren Bedürfnissen.

Anonyme Funktionen Ihnen erlauben würde, Ihre Ersatz parametrisieren:

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

Dokumentation: http://php.net/manual/en/function.preg-replace-callback.php

2

Sie können es mit zwei regulären Ausdrücke tun. Der erste wählt den gesamten Text zwischen {{ und }} aus und der zweite ersetzt @ mit ###. Unter Verwendung von 2 Regexes kann wie folgt geschehen:

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

Jetzt haben Sie die erste und zweite regex machen können, versuchen Sie, sich und wenn Sie es nicht tun, fragen Sie es in dieser Frage.

2

Eine andere Methode, die Regex (\{\{[^}]+?)@([^}]+?\}\}) zu verwenden wäre. Sie müssten über es ein paar Mal laufen mehrere @ s innerhalb {{ Klammern }} zum Spiel:

<?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; 

Welche Ausgänge:

{{einen Text ### anderen Text ### und ein anderer Text}} @ dies sollte nicht ersetzt werden {{aber das sollte: ###}}