代码之家  ›  专栏  ›  技术社区  ›  Alec Smart

不带eval的php preg_replace

php
  •  0
  • Alec Smart  · 技术社区  · 16 年前

    我尝试使用类似的东西:

    $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 回复  |  直到 16 年前
        1
  •  0
  •   Progman    16 年前

    这按预期工作…至少根据 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"
    
        2
  •  0
  •   Tomalak    16 年前
    $replacement = "START".$config."END"
    
        3
  •  0
  •   janmoesen    16 年前

    你试过把数组展平成一个字符串吗?

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

    编辑:既然你没有提到 $config 看来,我们不能给出确切的答复。

    推荐文章