2012-05-09 1 views
8

У меня есть строка, которая нравится этаЗаменить все вхождения внутри шаблона

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

Я хочу, чтобы он стал

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

Я предполагаю, что пример прямо вперед достаточно, и я не уверен, что я может лучше объяснить, чего я хочу достичь словами.

Я пробовал несколько разных подходов, но никто не работал.

ответ

8

Это может быть достигнуто с регулярным выражением обратного вызова в виде простой строки заменить:

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

Я выбрала простой нежадным регулярное выражение, чтобы найти фигурные скобки, но вы можете изменить это для производительности или в соответствии с вашими потребностями.

Анонимные функции позволит вам параметризировать ваши замены:

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

Документация: http://php.net/manual/en/function.preg-replace-callback.php

2

Вы можете сделать это с помощью 2 регулярных выражений. Первый выбирает весь текст между {{ и }}, а второй заменяется @ на ###. Использование 2-х регулярных выражений можно сделать так:

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

Теперь вы можете сделать первое и второе регулярное выражение, попробовать себя, и если вы не получите его, спросите его в этом вопросе.

2

Другой метод будет использовать регулярное выражение (\{\{[^}]+?)@([^}]+?\}\}). Вы должны были бы работать над ним несколько раз, чтобы соответствовать несколько @ S внутри {{ скобок }}:

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

который выводит:

{{некоторый текст ### другой текст ### и другой текст}} @ это должно не заменяться {{но это должно: ###}}

 Смежные вопросы

  • Нет связанных вопросов^_^