替换括号之间的特定字符

Replace specific character inbetween brackets

我想将 , 替换为位于 [] 之间的 : 个字符。 所以 [Hello, as] a, booby 会变成 [Hello: as] a, booby。我不知道如何匹配括号内的逗号,我可以将括号内的单词与 \[(.*)\] 但我不知道如何从那里选择逗号。

此外,如果我得到 [[Hello, as] a, booby],那么我也只想更改第一个逗号。我尝试使用 *+ 但它不起作用。

我需要这个

[["Sender", "mail@text.org"], ["Date", "Fri, 09 Jun 2017 13:29:22 +0000"]]

变成这样

[["Sender": "mail@text.org"], ["Date": "Fri, 09 Jun 2017 13:29:22 +0000"]]

我想使用 preg_replace 但我认为这不是正确的解决方案。

preg_replace("/(\[[^],]*),/U" , ':', $arr) 

returns

": mail@text.org"], : "Fri, 09 Jun 2017 13:29:22 +0000"]

尝试将逗号前后的所有内容分组,然后将它们放回冒号周围。

preg_replace('/(\[.*?),(.*?\])/',':',$string)

您可以使用基于 \G 的模式:

$str = preg_replace('~(?:\G(?!\A)|\[(?=[^][]*]))[^][,]*\K,~', ':', $str);

这种模式以交替的 2 个子模式开始:

  • \[(?=[^][]*]) 搜索 [ 后跟 ],它们之间没有其他括号。
  • \G(?!\A) 在前一个匹配后的位置匹配

然后,在这两种情况下[^][,]*\K,到达下一个只能在[]之间的,

但是由于您还需要跳过双引号之间的逗号,因此您必须在最终逗号之前匹配双引号部分。为此,将 [^][,]* 更改为 [^][",]*(?:"[^"\]*(?s:\.[^"\]*)*"[^][",]*)*+

$str = preg_replace('~(?:\G(?!\A)|\[(?=[^][]*]))[^][",]*+(?:"[^"\\]*(?s:\\.[^"\\]*)*"[^][",]*)*+\K,~', ':', $str);

demo

这看起来很简单:(Demo Link)

(?<="),

它对您的嵌套伪数组值做了一些假设。

PHP 实施:

$in='[["Sender", "mail@text.org"], ["Date", "Fri, 09 Jun 2017 13:29:22 +0000"], ["Name", "Dude"]]';
echo preg_replace('/(?<="),/',':',$in);

输出:

[["Sender": "mail@text.org"], ["Date": "Fri, 09 Jun 2017 13:29:22 +0000"], ["Name": "Dude"]]

如果这不适合您的实际字符串,请提供我的模式失败的字符串,以便我进行调整。扩展模式以确保逗号跟在引用的 "key" 之后,可以这样做:"[^"]+"\K, ...步长成本略高(但仍然不错)。