Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 替换括号之间的特定字符_Php_Regex_Preg Replace - Fatal编程技术网

Php 替换括号之间的特定字符

Php 替换括号之间的特定字符,php,regex,preg-replace,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"]]

我想将
替换为
字符,该字符位于
[]
之间。 因此,
[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_替换,但我认为这不是正确的解决方案

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

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

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

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

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

$str = preg_replace('~(?:\G(?!\A)|\[(?=[^][]*]))[^][,]*\K,~', ':', $str);
这种模式以交替的2个子模式开始:

  • \[(?=[^][]*])
    搜索一个
    [
    后接一个
    ]
    ,其间没有其他括号
  • \G(?!\A)
    在上一次匹配后的位置匹配
然后,在这两种情况下,到达下一个
,该
只能介于
[
]
之间

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


这似乎是我能做到的最简单的事情:()


如果这不适合您的实际字符串,请在我的模式失败的地方提供一个字符串,以便我可以调整它。扩展模式以确保逗号跟随引用的“键”可以这样做:
“[^”]+”\K,
…步进成本稍高一些(但仍然不错)。

您在使用什么?您可以使用例如lookaheads/lookbehinds吗?在替换字符串中使用捕获组如何?这里的答案非常有效
\[.*(,).*?\]'
。我尝试使用lookbehinds和捕获组,但没有成功。尝试替换为
$1:
。括号中是否有多个逗号?我认为不应该有多个逗号
$str = preg_replace('~(?:\G(?!\A)|\[(?=[^][]*]))[^][",]*+(?:"[^"\\\\]*(?s:\\\\.[^"\\\\]*)*"[^][",]*)*+\K,~', ':', $str);
(?<="),
$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"]]