我正在删除字符串中的某些字符:
% -> %%
: -> %c
/ -> %s
字符串“%c”已正确转义为%% c。但是,当我尝试用str_replace('%%','%c','%s'),数组('%',':','/'),$ s)将其反转时,它会转换它进入“:”。根据文档,这是str_replace的正确行为,这就是我正在寻找使用正则表达式的解决方案的原因。
请建议,我应该使用什么来正确解码转义字符串。谢谢。
答案 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);