【问题标题】:Regex to replace non escaped Quotes正则表达式替换非转义引号
【发布时间】:2013-09-23 07:09:46
【问题描述】:

在构建json 字符串时遇到一些麻烦后,我在我的数据库中发现了一些包含双引号的文本。我需要用转义的等价物替换引号。这有效:

function escape( $str ) {
    return preg_replace('/"/',"\\\"",$str);
}

但它没有考虑到引用可能已经被转义。如何修改表达式,使其仅适用于非转义字符?

【问题讨论】:

标签: php regex


【解决方案1】:

您需要在此处使用消极的后视

function escape( $str ) {
    return preg_replace('/(?<!\\)"/',"\\\"",$str);
}

【讨论】:

  • 嘿,谢谢。关于另一个问题,这个网站有时真的会引起我的注意,所有的downvotes 和closevotes ......都没有解释。它给我的印象是人们只是对它的地狱投了反对票。无论如何,对咆哮感到抱歉。我想出了在哪里放置一个积极的前瞻并让它工作。略有改动/^.*?(?:(?&lt;!\\)(?:(?P&lt;end&gt;}\s*)|(?P&lt;nest&gt;{[!#]?\s*))|(?=\\$)|$)/sm
  • @Waldermort,啊,我错过了你想匹配到$排除它。这种前瞻性是有道理的。很高兴知道你已经成功了。
  • 这是不够的。如果" 前面有两个反斜杠,则不会转义。
【解决方案2】:

首先尝试从所有转义的双引号中删除“\”,而不是转义所有双引号。

str_replace(array('\"', '"'), array('"', '\"'), $str);

【讨论】:

  • 但是像 Hello\\"World 这样的文本以转义斜线开头呢?
【解决方案3】:

试试preg_replace('/([^\\\])"/', '$1\\"', $str);

【讨论】:

    【解决方案4】:

    我相信this will work

    正则表达式:

    (?<!\\)((?:\\\\)*)"
    

    代码:

    $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
    

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多