为什么除了"位置,状态"中的逗号之外,所有逗号都替换为@?
$test = preg_replace("#([^ ])([,])([^ ])#","$1@$3","100,,,'test','two',,'location, state',,[],1")
预期:100@@@'test'@'two'@@'location, state'@@[]@1
实际:100@,,'test'@'two'@,'location, state'@,[]@1
我认为这是因为连续的逗号在模式中匹配,我如何让它从匹配字符的开头继续包含所有逗号?
使用这个:
preg_replace('/(?<!'s),(?!'s)/', '@', "100,,,'test','two',,'location, state',,[],1")
在单次preg_replace运行期间,之前匹配的字符串部分将不会再次匹配。所以第一个替换是这样的:
10(0)(,)(,),'test' => 100@,,'test'
^
现在标记的字符是允许preg_replace匹配的第一个字符 ->它也不会被替换,因为第一个([^ ])
没有什么可以匹配的。
您正在寻找的是前瞻和后瞻断言:
preg_replace("#(?<=[^ ])([,])(?=[^ ])#", "@", …)