preg_replace not working? PHP


preg_replace not working? PHP

为什么除了"位置,状态"中的逗号之外,所有逗号都替换为@?

$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("#(?<=[^ ])([,])(?=[^ ])#", "@", …)