2012-08-16 100 views
0

为什么这个不能用@代替所有的逗号,除了'位置,状态'中的那个?preg_replace不工作? PHP

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

预期:100个@@@ '测试' @ '二' @@ '的位置,状态' @@ [] @ 1

实测值:100 @ ,, '测试' @ '二' @,'location,state'@,[] @ 1

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

+0

什么是您目前的结果和你预期的结果? – Jocelyn 2012-08-16 05:41:07

回答

1

使用这一个:已经匹配之前不会得到的preg_replace单次运行期间再次匹配的字符串

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

完美,谢谢! – Craig 2012-08-16 05:54:05

0

零件。因此,第一个取而代之的是这样的:

10(0)(,)(,),'test' => [email protected],,'test' 
          ^

现在显着的特点是,preg_replace函数允许匹配的第一个 - >它也不会被替换,因为没有被第一([^ ])匹配。

你在找什么都look-ahead and look-behind assertions:

preg_replace("#(?<=[^ ])([,])(?=[^ ])#", "@", …)