为了匹配反斜杠,你需要"双重"它们,所以你最后有四个\:
$data = preg_replace('/\\\\"/', '"', $data);
Run Code Online (Sandbox Code Playgroud)
为什么你需要4 \:PHP解析一个字符串\\",\"而RegEx将其解释为,"因为在RegEx中你不需要转义".所以它不匹配\".\\\\"将被解析为RegEx \\"将解释为\".
除非后面的字符是可以转义的字符(例如反斜杠本身),否则不需要在单引号字符串或正则表达式中转义反斜杠.
双引号不需要转义,也不能在单引号字符串中转义.在正则表达式中,它不必是,但也可以.
这意味着\\在单引号字符串和正则表达式中都会变为\,而\"在单引号字符串中仍然存在\",而在正则表达式中它变为".
但是,在PHP中,您只能从字符串创建正则表达式,因此必须转义两次.
换一种说法...
Original string String processed Regexp processed
'/\"/' /\"/ "
'/\\"/' /\"/ "
'/\\\"/' /\\"/ \"
'/\\\\"/' /\\"/ \"
'/\\\\\"/' /\\\"/ \"
'/\\\\\\"/' /\\\"/ \"
'/\\\\\\\"/' /\\\\"/ \\"
Run Code Online (Sandbox Code Playgroud)
当然,在双引号字符串中,"确实需要进行转义,所以...
"/\"/" /"/ "
"/\\"/" syntax error
"/\\\"/" /\"/ "
"/\\\\"/" syntax error
"/\\\\\"/" /\\"/ \"
"/\\\\\\"/" syntax error
"/\\\\\\\"/" /\\\"/ \"
"/\\\\\\\\"/" syntax error
"/\\\\\\\\\"/" /\\\\"/ \\"
Run Code Online (Sandbox Code Playgroud)
我认为你应该preg_replace("/\\\\\\\"/", "\"", $data)只是为了安全的混乱.