我创建了一个模板系统,用于替换所有以'%%'开头和结尾的变量。问题是preg替换有时会替换它应该更多,这是一个例子:
<?php
$str = "100% text %everythingheregone% after text";
$repl = "test";
$patt = "/\%([^\]]+)\%/";
$res = preg_replace($patt, "", $str);
echo $res;
?>
输出“文本后100”,输出“文本后100%文本”。这有什么解决方案吗?这非常糟糕,因为如果文档中有CSS规则,则使用百分号,最终替换所有文档。
答案 0 :(得分:1)
使用否定的lookbehind匹配之后不存在的所有%
符号。
(?<!\d)%([^%]*)\%
然后用空字符串替换匹配的字符串。
$str = "100% text %everythingheregone% after text";
$repl = "test";
$patt = "/(?<!\d)%([^%]*)\%\s*/";
$res = preg_replace($patt, "", $str);
echo $res;
<强>输出:强>
100% text after text
答案 1 :(得分:1)
答案 2 :(得分:1)
问题是设计错误,不应该使用一些漂亮的正则表达式。考虑使用占位符的唯一标识符,只匹配允许的变量名称列表。
例如$str = "100% text {%_content_%}";
$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);