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"]]