如何在preg_replace中引用替换?

时间:2016-04-20 13:10:28

标签: php regex preg-replace

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

2 个答案:

答案 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来引用模式中的用户数据的工具!