正则表达式-使用负向先行断言进行转义

3

我有以下JSON编码的字符串:

$json = '"|\t|\n|\\\u0027|\\\u0022|"';

什么是最有效的方法来转义所有已经转义过的字符/码点,除了\\\u0022或\\\u0027?我考虑使用preg_replace()与负向先行断言正则表达式,但它并不像我预期的那样工作,输出应该是:
$json = '"|\\\t|\\\n|\\\u0027|\\\u0022|"';

我在 JSON-PHP-PCRE 转义的海洋中感到迷失,有人可以帮我解决吗?


1
你确定这是你想要的输出吗?对我来说有点不太合理,我原本期望的是像 |\\t|\\n... 这样的东西。你到底想做什么? - Justin Morgan
@Justin:是的,我在解码之前使用了stripslashes()函数,因此效果应该与您的完全相同。我的目标是从转义的\u002[27]代码点中删除转义符。@Marcel,@Unkwntech:你们为什么这么说?在我看来没问题啊。 - Alix Axel
1
哇,你说得对。我以为它至少需要一个键,但当然你可以简单地分配一个字符串而不是一个对象。 - Marcel Korpel
3个回答

2

如果使用负向先行断言,类似这样的内容可能有效:

<?php
  $json = '"|\t|\n|\\\u0027|\\\u0022|"';
  $s = preg_replace('~(\\\\)(?!(\\1|u002[27]))~', '$1$1$1', $json);
  var_dump($json);
  var_dump($s);
?>

输出

string(25) ""|\t|\n|\\u0027|\\u0022|""
string(29) ""|\\\t|\\\n|\\u0027|\\u0022|""

1

我有点困惑你具体想做什么,但是我可以用这个将你的输入转换为输出:

preg_replace('/\|\\([^\\])\|/', '\\\\\\$1|', $json);

注意:我现在不在电脑旁,无法验证这是否完美,但从这里看起来很好。

1

尝试

$result = preg_replace('/(?<!\\\\)\\\\(?!\\\\)/', '\\\\\\\\\', $subject);

这个函数只会找到单个的 \(即既不是前导也不是后继的 \),并将其替换为 \\\


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接