在构建字符串遇到问题后,json
我在数据库中发现了一些包含双引号的文本。我需要用转义的等价物替换引号。这有效:
function escape( $str ) {
return preg_replace('/"/',"\\\"",$str);
}
但它没有考虑到报价可能已经被转义。如何修改表达式,使其仅适用于非转义字符?
你需要在这里使用负面的lookbehind
function escape( $str ) {
return preg_replace('/(?<!\\)"/',"\\\"",$str);
}
首先尝试从所有转义的双引号中删除 '\',而不是转义所有双引号。
str_replace(array('\"', '"'), array('"', '\"'), $str);
尝试preg_replace('/([^\\\])"/', '$1\\"', $str);
我相信这会奏效
正则表达式:
(?<!\\)((?:\\\\)*)"
代码:
$re = '/(?<!\\\\)((?:\\\\\\\\)*)"/';
preg_replace($re, '$1\\"', 'foo"bar'); // foo\"bar -- slash added
preg_replace($re, '$1\\"', 'foo\\"bar'); // foo\"bar -- already escaped, nothing added
preg_replace($re, '$1\\"', 'foo\\\\"bar'); // foo\\\"bar -- not escaped, extra slash added