preg_replace是否可以替换两个符号之间的所有内容?

时间:2014-09-21 13:01:35

标签: php regex preg-replace

我创建了一个模板系统,用于替换所有以'%%'开头和结尾的变量。问题是preg替换有时会替换它应该更多,这是一个例子:

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

输出“文本后100”,输出“文本后100%文本”。这有什么解决方案吗?这非常糟糕,因为如果文档中有CSS规则,则使用百分号,最终替换所有文档。

3 个答案:

答案 0 :(得分:1)

使用否定的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

答案 1 :(得分:1)

如果您要求的话,可以使用此正则表达式找到两个%符号(并替换掉):

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

这是regex demo

答案 2 :(得分:1)

问题是设计错误,不应该使用一些漂亮的正则表达式。考虑使用占位符的唯一标识符,只匹配允许的变量名称列表。

例如$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