Замена символов «,» в нечетных позициях - PullRequest
0 голосов
/ 20 февраля 2020

Мне нужно заменить символы ',' на регулярные выражения в php, но только в нечетных позициях

У меня есть:

{"phone","11975365654","name","John Doe","cpf","42076792864"}

Я хочу заменить ' , 'to': ', но только нечетное:

{"phone":"11975365654","name":"John Doe","cpf":"42076792864"}

Я пытаюсь это регулярное выражение:

preg_replace('/,/', ':', $data)

Но он получает все цитаты, а не только нечетные.

Можете ли вы помочь мне?

Ответы [ 5 ]

1 голос
/ 20 февраля 2020

Сделать проще:

preg_replace('/(("[a-z]+"),(".+?"))+/', '$2:$3', $a)
1 голос
/ 20 февраля 2020

Вместо регулярного выражения это просто преобразует список в массив (используя str_getcsv(), чтобы справиться с кавычками). Затем зацикливает каждый другой элемент в списке, используя этот элемент в качестве ключа и следующий элемент в качестве значения. Это может быть json_encoded(), чтобы получить результат ...

$data = str_getcsv(trim($input, "{}"));
$output = [];
for ( $i=0, $k=count($data); $i < $k; $i+=2)   {
    $output[$data[$i]] = $data[$i+1];
}

echo json_encode($output);
0 голосов
/ 20 февраля 2020

Другим вариантом может быть использование array_splice и l oop, пока в массиве все еще есть элементы:

$str   = '{"phone","11975365654","name","John Doe","cpf","42076792864"}';
$data  = str_getcsv(trim($str, '{}'));
$result = array();

while(count($data)) {
    list($k, $v) = array_splice($data, 0, 2);
    $result[$k] = $v;
}
echo json_encode($result);

Вывод

{"phone":"11975365654","name":"John Doe","cpf":"42076792864"}
0 голосов
/ 20 февраля 2020

Вот пример использования стандартных PHP функций:

$input   = '{"phone","11975365654","name","John Doe","cpf","42076792864"}';
$dataIn  = str_getcsv(trim($input, '{}'));

$keys    = array_filter($dataIn, function ($key) { return !($key & 1); }, ARRAY_FILTER_USE_KEY); 
$values  = array_filter($dataIn, function ($key) { return $key & 1; }, ARRAY_FILTER_USE_KEY); 

$DataOut = array_combine($keys, $values);
$output  = json_encode($DataOut);

echo $output;

Этот код намного длиннее, чем использование регулярных выражений, но, вероятно, его легче читать и поддерживать в долгосрочной перспективе. Может справляться с запятыми в значениях.

0 голосов
/ 20 февраля 2020

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

$str = '{"phone","11975365654","name","John Doe","cpf","42076792864"}';
$result = preg_replace('/,(.*?(?:,|[^,]*$))/ms', ':\\1', $str);

Это снисходительно к некоторым дополнительным символам, но произойдет сбой, если любая строка содержит запятые

Пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...