使用正则表达式取消转义字符

时间:2011-07-29 14:39:51

标签: php regex

我正在删除字符串中的某些字符:

% -> %%
: -> %c
/ -> %s

字符串“%c”已正确转义为%% c。但是,当我尝试用str_replace('%%','%c','%s'),数组('%',':','/'),$ s)将其反转时,它会转换它进入“:”。根据文档,这是str_replace的正确行为,这就是我正在寻找使用正则表达式的解决方案的原因。

请建议,我应该使用什么来正确解码转义字符串。谢谢。

3 个答案:

答案 0 :(得分:3)

您需要立即替换所有转义序列,而不是连续替换:

preg_replace_callback('/%([%cs])/', function($match) {
    $trans = array('%' => '%', 'c' => ':', 's' => '/');
    return $trans[$match[1]];
}, $str)

答案 1 :(得分:1)

您可以使用preg_replace管道(带有临时标记):

<?php

$escaped = "Hello %% World%c You'll find your reservation under %s";

echo preg_replace("/%TMP/", "%",
        preg_replace("/%s/", "/", 
            preg_replace("/%c/", ":", 
                preg_replace("/%%/", "%TMP", $escaped)));

echo "\n";

# Output should be
# Hello % World: You'll find your reservation under /

?>

答案 2 :(得分:0)

从您的评论(您想要从“%% c”到“%c”),而不是从“%% c”直接到“:”),您可以使用Gumbo的方法进行一些修改,我想:

$unescaped = preg_replace_callback('/%(%[%cs])/', function($match) {
    return $match[1];
}, $escaped);