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