Regex - побег с негативным взглядом - PullRequest
3 голосов
/ 09 мая 2011

У меня есть следующая строка в кодировке JSON:

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

Какой самый эффективный способ escape all (уже) экранированные символы / кодовые точки, кроме \\\u0022 или \\\u0027? Я хотя бы об использовании preg_replace() с регулярным выражением с отрицательным прогнозом, но он не работает, как я ожидал, вывод должен быть:

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

Я чувствую себя потерянным вкто-нибудь может мне помочь в этом океане JSON-PHP-PCRE?

Ответы [ 3 ]

2 голосов
/ 10 мая 2011

Примерно так может работать с помощью негативного взгляда:

<?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 голос
/ 10 мая 2011

Попробуйте

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

. Находит \ только в том случае, если оно одиночное (т. Е. Не предшествует и не следует другой \), и заменяет его на \\\.

1 голос
/ 10 мая 2011

Меня немного смущает, что именно вы пытаетесь сделать, но я могу преобразовать ваш ввод в ваш вывод с помощью этого:

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

Примечание: я не за компьютером, поэтому могуне проверяйте, что это идеально, но отсюда все выглядит хорошо.

...