为什么我的正则表达式模式不将除
'location, state'
中的逗号之外的所有逗号替换为 @?
$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("#(?<=[^ ])([,])(?=[^ ])#", "@", …)