Это может быть проще сделать за несколько шагов:
- Разделить на
~
- Преобразовать части, которые находятся "внутри" только
~
- Просто замените
','
на ''
- Соедините детали вместе с
~
Решением регулярного выражения
Тем не менее, можно сделать в регулярном выражении, предполагая четное число ~
:
<?php
echo preg_replace(
'/(^[^~]*~)|([^~]*$)|([^,~]*),|([^,~]*~[^~]*~)/',
'$1$2$3$4',
'a,b,c,~d,e,f~,g,h,i,~j,k,l,~m,n,o~,q,r,~s,t,u'
);
?>
Приведенные выше отпечатки ( как виднона codepad.org ):
a,b,c,~def~,g,h,i,~jkl~m,n,o~qr~s,t,u
Как это работает
Есть 4 случая:
- Мы находимся в начале строки, "снаружи"
- Просто сопоставьте, пока мы не найдем первое
~
, поэтому в следующий раз мы будем "внутри" - Итак,
(^[^~]*~)
- Больше нет
~
до конца строки - Если будет четное число
~
, мы будем "снаружи" - Просто совпадать доend
- Итак,
([^~]*$)
- Если это не так, мы "внутри"
- Продолжайте находить следующую запятую до
~
(поэтому мы все еще "внутри") - Если мы найдем
~
вместо запятой, затем выйдите, затем вернитесь к следующему ~
Во всех случаях мы делаем все возможное, чтобы восстановить строку.
Ссылки