2014-09-21 2 views
1

Я создал систему шаблонов, которая заменяет все переменные, начинающиеся и заканчивающиеся на «%%». Проблема заключается в том, что PREG заменить иногда заменяет более, чем это необходимо, вот пример:preg_replace Можно ли заменить все между двумя символами?

<?php 
    $str = "100% text %everythingheregone% after text"; 
    $repl = "test"; 
    $patt = "/\%([^\]]+)\%/"; 
    $res = preg_replace($patt, "", $str); 
    echo $res; 
?> 

Это выводит «100 после того, как текст», и он должен вывести «100% текст после текста». Есть ли какие-либо решения? Это очень плохо, потому что, если в документе есть правила CSS, используются процентные знаки, и это приводит к замене всего документа.

ответ

2

Используйте отрицательный lookbehind для соответствия всем % символам, которых нет сразу после цифры.

(?<!\d)%([^%]*)\% 

Затем замените соответствующие строки пустой строкой.

DEMO

$str = "100% text %everythingheregone% after text"; 
$repl = "test"; 
$patt = "/(?<!\d)%([^%]*)\%\s*/"; 
$res = preg_replace($patt, "", $str); 
echo $res; 

Выход:

100% text after text 
2

Вы можете найти из двух % символов с этими регулярными выражениями (и заменить прочь), если это то, что вы просите:

/.*\K%[^%]+%/ 

Адрес regex demo!

2

Проблема в неисправном дизайне и не должна обрабатываться с помощью какого-либо изящного регулярного выражения. Подумайте об использовании уникальных идентификаторов для заполнителей и только в соответствии с разрешенным списком имен переменных.

Такие, как $str = "100% text {%_content_%}";

и замену с использованием str_replace()

$res = str_replace("{%_content_%}", "test", $str); 

или strtr() для нескольких Заменяет:

$replace_map = array(
"{%_content_%}" => "test", 
"{%_foo_%}" => "bar", 
); 

$res = strtr($str, $replace_map); 

Просто идея целевой основной вопрос.


До тех пор заменить %containing_word_characters%

$res = preg_replace('~%\w+%~', "test", $str); 

test at regex101

+1

Отлично! Невероятно, что вы заметили смысл словесных символов. Я подумал об этом некоторое время, затем решил, что, вероятно, это не так. – Unihedron

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