将不在单引号内的逗号替换为@符号

问题描述 投票:0回答:2

为什么我的正则表达式模式不将除

'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

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

php regex csv replace preg-replace
2个回答
1
投票

使用这个:

preg_replace('/(?<!\s),(?!\s)/', '@', "100,,,'test','two',,'location, state',,[],1")

0
投票

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

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

现在标记的字符是第一个允许 preg_replace 匹配的字符 -> 它也不会被替换,因为第一个

([^ ])
没有任何东西可以匹配。

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

preg_replace("#(?<=[^ ])([,])(?=[^ ])#", "@", …)
© www.soinside.com 2019 - 2024. All rights reserved.