7

我整天都在试图逃避双引号内的所有双引号(是的,疯了),我终于放弃了。我有这样的数据:

{ "test": "testing with "data" like this", "subject": "trying the "special" chars" }

我一直在尝试用这样的东西preg_replace every ",这意味着双引号内的所有内容,后跟逗号和空格。\"/"(.*)+, "/

我需要一种方法来改变它:

{ "test": "testing with "data" like this", "subject": "trying the "special" chars" }

进入这个:

{ "test": "testing with \"data\" like this", "subject": "trying the \"special\" chars" }

使用 preg_replace。

4

1 回答 1

13

查看您的正则表达式,我建议您阅读正则表达式贪婪。如果您选择引号到第一个逗号之间的所有内容,则会遇到问题。返回的第一件事就是test": "testing with "data" like this这样,如果您将所有替换"\"您将拥有的test\": \"testing with \"data\" like this,这显然不是您想要的。我建议使用这样的东西:

/"((?:.|\n)*?)"\s*[:,}]\s*/

解释

  • "((?:.|\n)*?)"- 捕获两个引号之间的任何字符;最小数量,同时仍然使模式为真
  • \s*- 匹配 0 个或多个空白字符
  • [:,}]- 匹配冒号、逗号或右括号字符
  • \s*- 匹配 0 个或多个空白字符

使用此正则表达式和您的数据,返回的第一件事是test. 更换后的下一件事就是testing with "data" like this这样testing with \"data\" like this


更新

$test = '{ "test": "testing with "data" like this", "subject": "trying the "special" chars" }';
$pattern = '/"((?:.|\n)*?)"\s*[:,}]\s*/';
preg_match_all($pattern, $test, $matches);
foreach($matches[1] as $match){
    $answers[] = str_replace('"','\\"',$match);
}
print_r($answers);
// Outputs
// Array ( [0] => test [1] => testing with \"data\" like this [2] => subject [3] => trying the \"special\" chars )


更新 2

我认为使用preg_match_all然后str_replace是解决问题的更好方法,因为该正则表达式更加稳定。但是如果你坚持使用preg_replace那么你可以使用这个代码:

$string = '{ "test": "testing with "data" like this", "subject": "trying the "special" chars" }';
$pattern = '/(?<!:|: )"(?=[^"]*?"(( [^:])|([,}])))/';
$string = preg_replace($pattern, '\\"', $string);
print_r($string);
//Outputs
//{ "test": "testing with \"data\" like this", "subject": "trying the \"special\" chars" }

解释

  • (?<!- 开始消极的回顾
  • :|: )- 匹配冒号或带有空格的冒号并结束后视
  • "- 匹配一个报价
  • (?=- 开始积极的前瞻
  • [^"]*?- 匹配除引用之外的任何内容;最小数量,同时仍然使模式为真
  • "(( [^:])|([,}]))- 匹配引号后跟空格和除冒号以外的任何内容,或者匹配引号后跟逗号或右括号
  • )- 结束前瞻

您可以在此处阅读有关正则表达式前瞻的更多信息。我认为这个正则表达式很混乱,尽管从技术上讲它是有效的。我打算继续玩它以使其变得更好,但我累了,所以我现在要睡觉了。此正则表达式允许您的数据更松散地键入。这两项工作,以及它们的任何组合:

{ "test" : "testing with "data" like this" , "subject" : "trying the "special" chars" }
{"test":"testing with "data" like this","subject":"trying the "special" chars"}
于 2012-09-05T23:04:55.547 回答