laapsaap
laapsaap

Reputation: 181

How to use php preg_split to split a string and keep part of the used delimiter?

I need to use preg_split to split the string below by using "};{" as the delimiter. But I want to keep/return the } and { in the returned array.

Regex can do so much, but wondering if this is possible using preg_split.

{'aid':10,'aSL'{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0},'hs':'4.8','l_p':1229241600},{'aid':80,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}},{'aid':100,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}},{'aid':30,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}},{'aid':40,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}},{'aid':60,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}}

I want it to return like this

[0] => {'aid':10,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0},'hs':'4.8','l_p':1229241600}
[1] => {'aid':80,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}
[2] => {'aid':100,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}
[3] => {'aid':30,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}
[4] => {'aid':40,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}
[5] => {'aid':60,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}

Upvotes: 1

Views: 307

Answers (2)

Jonny 5
Jonny 5

Reputation: 12389

To not include } { in the split-sequence, could use lookarounds instead:

(?<=}),(?={) or (?<=});(?={)

Test at regex101.com


For use with the regex-functions need to put that into delimiters: /pattern/

Upvotes: 2

gmsantos
gmsantos

Reputation: 1419

You can use Regex Look behind and look ahead:

<?php

$string = "{'aid':10,'aSL'{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0},'hs':'4.8','l_p':1229241600},{'aid':80,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}},{'aid':100,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}},{'aid':30,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}},{'aid':40,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}},{'aid':60,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}}";

$matches = preg_split('/(?<=}),(?={)/', $string);

var_dump($matches);

Returns:

array(6) {
  [0]=>
  string(92) "{'aid':10,'aSL'{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0},'hs':'4.8','l_p':1229241600}"
  [1]=>
  string(59) "{'aid':80,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}}"
  [2]=>
  string(60) "{'aid':100,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}}"
  [3]=>
  string(65) "{'aid':30,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}}"
  [4]=>
  string(59) "{'aid':40,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}}"
  [5]=>
  string(65) "{'aid':60,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}}"
}

Upvotes: 1

Related Questions