为什么这不能用@替换所有逗号除了'location,state'中的逗号?
$test = preg_replace("#([^ ])([,])([^ ])#","$1@$3","100,,,'test','two',,'location, state',,[],1")
预计:100 @@@'test'@'two'@@'位置,州'@@ [] @ 1
实际:100 @ ,,'测试'@'两个'@,'位置,状态'@,[] @ 1
我认为这是因为连续逗号在模式中匹配,如何从匹配字符的开头继续逗号以包含所有逗号?
答案 0 :(得分:1)
使用这个:
preg_replace('/(?<!\s),(?!\s)/', '@', "100,,,'test','two',,'location, state',,[],1")
答案 1 :(得分:0)
之前匹配的字符串部分在一次运行preg_replace期间不会再次匹配。所以第一个替换是:
10(0)(,)(,),'test' => 100@,,'test'
^
现在标记的字符是第一个允许preg_replace匹配的字符 - &gt;它也不会被替换,因为第一个([^ ])
没有任何东西可以匹配。
您要找的是look-ahead and look-behind assertions:
preg_replace("#(?<=[^ ])([,])(?=[^ ])#", "@", …)