preg_replace无法正常工作? PHP

时间:2012-08-16 05:39:13

标签: php regex preg-replace

为什么这不能用@替换所有逗号除了'location,state'中的逗号?

$test = preg_replace("#([^ ])([,])([^ ])#","$1@$3","100,,,'test','two',,'location, state',,[],1")

预计:100 @@@'test'@'two'@@'位置,州'@@ [] @ 1

实际:100 @ ,,'测试'@'两个'@,'位置,状态'@,[] @ 1

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

2 个答案:

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