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