Thiago Bueno Fiorenza
Thiago Bueno Fiorenza

Reputation: 37

Replacing ',' characters in only odd positions

I need replace ',' characters with regex in php, but only in odd positions

I have:

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

I want replace ',' to ':', but only the odd:

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

I'm trying this regex:

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

But it get all quotes and no only the odd.

Can you help me?

Upvotes: 0

Views: 307

Answers (5)

The fourth bird
The fourth bird

Reputation: 163342

Another option could be using array_splice and loop while there are still elements in the array:

$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);

Output

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

Upvotes: 0

Marcelo Rodovalho
Marcelo Rodovalho

Reputation: 923

Make it simple:

preg_replace('/(("[a-z]+"),(".+?"))+/', '$2:$3', $a)

Upvotes: 1

Nigel Ren
Nigel Ren

Reputation: 57121

Rather than regex, this just converts the list to an array (using str_getcsv() to cope with the quotes). Then loops every other item in the list, using that item as the key and the next item as the value. This can then be json_encoded() to give the result...

$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);

Upvotes: 1

KIKO Software
KIKO Software

Reputation: 16688

Here's an example of using standard PHP functions:

$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;

This code is a lot longer than using a regex, but it is probably easier to read and maintain in the long run. It can cope with commas in the values.

Upvotes: 0

Diadistis
Diadistis

Reputation: 12174

It is not ideal to use regex for this task. Having said that, if you know that your input can be matched by a simple regex, this should do it :

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

This lenient to some extra characters but it will fail if any string contains commas

Example

Upvotes: 0

Related Questions