正则表达式 - 使用负前瞻转义

发布于 2024-11-06 04:54:46 字数 387 浏览 1 评论 0原文

我有以下 JSON 编码字符串:

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

除了 \\\u0022 或 < 之外,转义所有(已经)转义的字符/代码点的最有效方法是什么? code>\\\u0027? 我想过将 preg_replace() 与负前瞻正则表达式一起使用,但它没有按我的预期工作,输出应该是:

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

I'我在 JSON-PHP-PCRE 逃逸的海洋中感到迷失,有人可以帮助我吗?

I have the following JSON-encoded string:

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

What is the most efficient way to escape all the (already) escaped chars / codepoints except \\\u0022 or \\\u0027? I though about using preg_replace() with a negative lookahead regular expression but it's not working as I expected, the output should be:

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

I'm feeling lost in this ocean of JSON-PHP-PCRE escaping, can someone help me out?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

瘫痪情歌 2024-11-13 04:54:46

像这样的事情可能会在负前瞻的帮助下起作用:

<?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|""

Something like this may work with the help of negative lookahead:

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

OUTPUT

string(25) ""|\t|\n|\\u0027|\\u0022|""
string(29) ""|\\\t|\\\n|\\u0027|\\u0022|""
疯到世界奔溃 2024-11-13 04:54:46

我对你想要做的事情有点困惑,但我可以用这个将你的输入转换为你的输出:

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

注意:我不在我的电脑旁,所以我无法验证这是否完美,但它看起来不错这里。

I'm a bit confused by exactly what you are trying to do but I can transform your input to your output with this:

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

Note: I'm not at my computer so I can't verify that this is perfect but it looks good from here.

记忆消瘦 2024-11-13 04:54:46

尝试

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

仅在 \ 是单个(即前面或后面都没有另一个 \)时查找 \,并将其替换为 \\\

Try

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

This finds a \ only if it is single (i. e. neither preceded nor followed by another \) and replaces it with \\\.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文