没有eval的PHP preg_replace

时间:2010-06-03 11:21:55

标签: php

我试图使用类似的东西:

$newdata = preg_replace($pattern, $replacement, $data);

现在我的替换就像是

$pattern = "/START(.*?)END/is";
$replacement = "START $config END";

现在,$ config包含

之类的内容
array('Test\\\'s Page')

问题在于,在我写完内容后,$ newdata变为

START array('Test\\'s Page') END

正如您在上面看到的那样,单个\会丢失,因为它会被评估。我该如何避免?

3 个答案:

答案 0 :(得分:0)

$replacement = "START".$config."END"

答案 1 :(得分:0)

您是否尝试将数组展平为字符串?

$replacement = sprintf('START %s END', implode('', $config));

编辑:既然你没有提到$config的样子,我们就无法给出明确的答案。

答案 2 :(得分:0)

这可以按预期工作......至少根据manual of preg_replace

  

要替换使用反斜杠,必须加倍(“\\\\”PHP字符串)。

这是必需的,因为您可以使用\\n进行反向引用。如果你不想要一个后向引用但想要\本身,你需要逃避它。如果你想要3个反斜杠,你必须写6个反斜杠。

$data = 'Some START END testdata';
$config = 'array(\'Test\\\\\\\\\\\\\'s Page\')';
$replacement = "START $config END";
$pattern = "/START(.*?)END/is";
var_dump($data, $config, $replacement, $pattern);
$newdata = preg_replace($pattern, $replacement, $data);
var_dump($newdata);

这将生成以下输出。

string(23) "Some START END testdata"
string(26) "array('Test\\\\\\'s Page')"
string(36) "START array('Test\\\\\\'s Page') END"
string(17) "/START(.*?)END/is"
string(47) "Some START array('Test\\\'s Page') END testdata"