【问题标题】:Regex - Escape with Negative Lookahead正则表达式 - 使用负前瞻转义
【发布时间】:2011-05-09 19:56:16
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你确定这是你想要的输出吗?这对我来说不太有意义,我本来期望像|\\t|\\n... 这样的东西。你到底想做什么?
  • @Justin:是的,我在解码之前使用stripslashes(),所以效果应该和你的完全一样,从转义的\u002[27]代码点中删除转义是我的目标。 @Marcel,@Unkwntech:你为什么这么说?在我看来很合适。
  • 哇,你说得对。我认为它至少需要一个键,但当然你可以简单地分配一个字符串而不是一个对象。

标签: php regex escaping preg-replace negative-lookahead


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我对您正在尝试做的事情感到有些困惑,但我可以通过以下方式将您的输入转换为输出:

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

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

    【讨论】:

      【解决方案3】:

      试试

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

      仅当 \ 是单一的(即既不在另一个 \ 之前也不在其后)时,它才会找到 \,并将其替换为 \\\

      【讨论】:

        猜你喜欢
        • 2021-10-11
        • 2011-10-14
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多