Search code examples
phpregexpcre

PHP regex - Divide plain text by string object


I have a file.txt with this content:

{"name":"merli"}{"name":"berta"}{"name":"ivan"}
{"name":"joan"}
{"name":"mireia"}{"name":"pol"}
{"name":"gerard"}

I am using this code, but i don't know how to separate by "}{" without losing the brackets

$exploded = preg_split('/\r\n|\r|\n|}{/', 'file.txt');

The result i am getting is like:

Array (
    0: {"name":"merli"
    1: "name":"berta"
    2: "name":"ivan"}
    3: {"name":"joan"}
    4: {"name":"mireia"
    5: "name":"pol"}
    6: {"name":"gerard"}
)

And I need this:

Array (
    0: {"name":"merli"}
    1: {"name":"berta"}
    2: {"name":"ivan"}
    3: {"name":"joan"}
    4: {"name":"mireia"}
    5: {"name":"pol"}
    6: {"name":"gerard"}
)

Solution

  • You can simply loop over the string characters and don't involve with \r and \n characters at all. Find {, find } and have all characters in between them in $temp as shown below.

    Snippet:

    <?php
    
    $str = '{"name":"merli"}{"name":"berta"}{"name":"ivan"}
    {"name":"joan"}
    {"name":"mireia"}{"name":"pol"}
    {"name":"gerard"}';
    
    $result = [];
    $len = strlen($str);
    
    for($i = 0;$i < $len;++$i){
        while($i < $len && $str[$i] != '{') $i++;
        $temp = '';
        while($i < $len && $str[$i] != '}') $temp .= $str[$i++];
        $temp .= '}';
        $result[] = $temp;
    }
    
    print_r($result);
    

    Demo: https://3v4l.org/1OFen