E.g。在下面的代码中,如果用户希望模板的新内容为字符串C:\Users\Admin\1
,则\1
部分将变为BEGIN this was the original content of the template END
,这是我不想要的。< / p>
preg_replace('/(BEGIN.*?END)/su', $_POST['content'], $template);
答案 0 :(得分:3)
简而言之,使用此函数引用动态替换模式:
function preg_quote_replacement($repl_str) {
return str_replace(array('\\', '$'), array('\\\\', '\\$'), $repl_str);
}
问题是,你需要在替换模式中逃避反斜杠。见preg_replace
docs:
要替换使用反斜杠,必须加倍(
"\\\\"
PHP字符串)。
只需str_replace
函数即可完成:
$repl = 'C:\Users\Admin\1';
$template = "BEGIN this was the original content of the template END";
echo preg_replace('/(BEGIN.*?END)/su', str_replace('\\', '\\\\', $repl), $template);
请参阅IDEONE demo
然而,注意,替换模式中$
符号也特殊。因此,我们还需要逃避这个符号。这些prelimnary替换的顺序很重要:首先,我们需要逃避\
,然后$
:
$r = '$1\1';
echo preg_replace('~(B.*?S)~', str_replace(array('\\', '$'), array('\\\\', '\\$'), $r), "BOSS");
请参阅IDEONE demo(在您的代码中preg_replace('/(BEGIN.*?END)/su', str_replace(array('\\', '$'), array('\\\\', '\\$'), $_POST['content']), $template);
或使用我在帖子开头添加的功能。)
答案 1 :(得分:0)
您可以使用T-Regx中的automatically quotes all kinds of references with replacing:
pattern('(\d+)cm')->replace('I have 15cm and 192cm')->all()->with('<\\2>');
产生
I have <\2> and <\2>
还可以处理$1
和${2}
引用。
PS:T-Regx还具有使用pattern building来引用模式中的用户数据的工具!