替换括号中的特定字符

时间:2017-06-09 13:22:46

标签: php regex preg-replace

我想将,替换为位于:之间的[]字符。 因此[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) 

返回

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

3 个答案:

答案 0 :(得分:1)

这看起来很简单:( 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"]]

如果这不适合您的实际字符串,请提供我的模式失败的字符串,以便我可以调整它。扩展模式以确保该逗号遵循引用的&#34;键&#34;可以这样做:"[^"]+"\K, ......步数稍高(但仍然不错)。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

  • \[(?=[^][]*])搜索[后跟],但不包含其他括号。
  • \G(?!\A)匹配上一场比赛后的位置

然后,在[^][,]*\K,这两个案例中,,到达[]之间的[^][,]*

但是,由于您还需要在双引号之间跳过逗号,因此必须在最终逗号之前匹配双引号部分。为此,请将[^][",]*(?:"[^"\\]*(?s:\\.[^"\\]*)*"[^][",]*)*+更改为$str = preg_replace('~(?:\G(?!\A)|\[(?=[^][]*]))[^][",]*+(?:"[^"\\\\]*(?s:\\\\.[^"\\\\]*)*"[^][",]*)*+\K,~', ':', $str);

str.split

demo