【问题标题】:preg_replace double quotation mark not following a commapreg_replace 双引号不跟在逗号后面
【发布时间】:2015-10-06 00:52:57
【问题描述】:

我正在尝试找到正确的正则表达式模式来替换不在逗号,之后的双引号

在下面的字符串中,当它出现在一些不是分隔符/逗号的字符之后时,只删除一个双引号

"ahys"", "hshs","", "277-""

上面的字符串在preg_replace之后变成了这个

"ahys", "hshs","", "277-"

我正在使用这种模式,但它不起作用 - 它不仅替换引号,还替换左侧的一个字符

preg_replace('/([^"",])["]["]/', '"', '"ahys"", "hshs","", "277-""');

结果:

“啊哈”、“hshs”、“”、“277”

谁能告诉我这里的模式有什么问题?

【问题讨论】:

  • [^"",] 的意思是“不是引号也不是逗号”。有两个" 毫无意义,因为它是一个字符类。 [aa][a] 将执行相同的操作。和单字符字符类同样无用。 "["] 也执行相同的操作。
  • 只需将“”替换为“
  • @MarcB 明白了,谢谢,但我的问题仍然存在
  • 是否可以有两个以上的连续双引号?在这种情况下,你想做什么?另一个问题,如果一个项目 (即双引号之间的子字符串) 以逗号结尾并用两个双引号关闭会发生什么?
  • @CasimiretHippolyte 不会有两个连续的双引号 - 用两个双引号关闭,比如?

标签: php regex


【解决方案1】:

也许是这样的:

(?<!^|,\s|,)"(?!,|$)

https://regex101.com/r/cE2yD0/1

它使用环视查找满足以下条件的"s:

  • 不在字符串的开头或结尾

  • , 之前或之后都没有(" 之前有可选空格)

【讨论】:

    【解决方案2】:

    如果您不想使用正则表达式外观,那么您可以使用这样的正则表达式:

    ("[\w-]+?")"
    

    使用替换字符串:

    $
    

    Working demo

    代码

    $re = '/("[\w-]+?")"/'; 
    $str = "\"ahys\"\", \"hshs\",\"\", \"277-\"\"\n"; 
    $subst = "$1"; 
    
    $result = preg_replace($re, $subst, $str);
    

    【讨论】:

    • 只要只有一个封闭的 " 并且它与结束 " 相邻,就可以很好地工作。但这可能符合 OP 的要求。
    • @dustmouse 是的,将答案另外发布给您,因为可能是这种情况。
    • 肯定的。这是一个不错的无环视解决方案。
    【解决方案3】:

    你也可以使用更快的str_replace

    <?php
    
        $str = 'test one -> " <- removed, not -> ", <- removed, not -> ," <- removed'
    
        echo str_replace( array( '",', ',"', '"', '%@@%,', ',%@@%' ), array( '%@@%,', ',%@@%', '', '",', ',"'), $str );
    
        // prints test one ->  <- removed, not -> ", <- removed, not -> ," <- removed
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2021-08-17
      • 2020-06-13
      • 1970-01-01
      相关资源
      最近更新 更多