preg_replace не работает? PHP

Почему это не заменяет все запятые на @, кроме той, что в «местоположении, состоянии»?

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

Ожидается: 100@@@'тест'@'два'@@'местоположение, состояние'@@[]@1

Фактические: 100@,,'тест'@'два'@,'местоположение, состояние'@,[]@1

Я думаю, это потому, что последовательные запятые совпадают в шаблоне, как мне заставить его продолжаться с начала совпадающего символа, чтобы включить все запятые?


person Craig    schedule 16.08.2012    source источник
comment
Каков ваш текущий результат и ожидаемый результат?   -  person Jocelyn    schedule 16.08.2012


Ответы (2)


Используйте этот:

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

Части строки, которые были сопоставлены ранее, не будут сопоставлены снова во время одного запуска preg_replace. Итак, первая замена такова:

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

Теперь помеченный символ является первым, которому может соответствовать preg_replace -> он также не будет заменен, потому что первому ([^ ]) нечего сопоставлять.

То, что вам нужно, это упреждающие и ретроспективные утверждения:

preg_replace("#(?<=[^ ])([,])(?=[^ ])#", "@", …)
person Chronial    schedule 16.08.2012