0

为什么除了“位置,状态”中的逗号之外,没有用@替换所有逗号?

$test = preg_replace("#([^ ])([,])([^ ])#","$1@$3","100,,,'test','two',,'location, state',,[],1")

预期:100@@@'test'@'two'@@'位置,状态'@@[]@1

实际:100@,,'test'@'two'@,'location, state'@,[]@1

我认为这是因为连续逗号在模式中匹配,我如何让它从匹配字符的开头继续包含所有逗号?

4

2 回答 2

1

使用这个:

preg_replace('/(?<!\s),(?!\s)/', '@', "100,,,'test','two',,'location, state',,[],1")
于 2012-08-16T05:46:51.303 回答
0

在一次 preg_replace 运行期间,之前匹配的部分字符串将不会再次匹配。所以第一个替换是这样的:

10(0)(,)(,),'test'  => 100@,,'test'
                            ^

现在标记的字符是 preg_replace 允许匹配的第一个字符 -> 它也不会被替换,因为第一个没有什么可以匹配的([^ ])

您正在寻找的是前瞻和后瞻断言:

preg_replace("#(?<=[^ ])([,])(?=[^ ])#", "@", …)
于 2012-08-16T05:48:58.843 回答