3

次の JSON エンコードされた文字列があります。

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

またはを除くすべての(すでに)エスケープされた文字/コードポイントをエスケープ\\\u0022\\\u0027する最も効率的な方法は何ですか? 負の先読み正規表現を使用preg_replace()することについて考えましたが、期待どおりに機能していません。出力は次のようになります。

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

この JSON-PHP-PCRE エスケープの海で迷っています。誰か助けてくれませんか?

4

3 に答える 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|""
于 2011-05-09T20:42:37.590 に答える
1

私はあなたがやろうとしていることで少し混乱していますが、これであなたの入力をあなたの出力に変換することができます:

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

注:私は自分のコンピューターを使用していないため、これが完璧であることを確認できませんが、ここからは見栄えがします。

于 2011-05-09T20:24:41.700 に答える
1

試す

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

\これは、単一の場合 (つまり、別の が前後にない場合) にのみa を検索し、\それを に置き換えます\\\

于 2011-05-09T20:27:15.797 に答える