PHP regex - 按字符串对象划分纯文本

PHP regex - Divide plain text by string object

我有一个 file.txt 内容如下:

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

我正在使用这段代码,但我不知道如何在不丢失括号的情况下用“}{”分隔

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

我得到的结果是这样的:

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

我需要这个:

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

您可以使用 preg_match_all:

$fileContents = '
{"name":"merli"}{"name":"berta"}{"name":"ivan"}
{"name":"joan"}
{"name":"mireia"}{"name":"pol"}
{"name":"gerard"}
';

// $matches is the array containing each matche found
preg_match_all('/{[^{]+}+?/', $fileContents, $matches);

// to rearrange $matches as plaintext
echo $result = join("\n", $matches[0]);

输出:

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

你可以试试here.

这也会捕获像 {"name":"..."} {"name":"..."}{"name":"..."}everyOtherUnexpectedChar{"name":"..."} 这样的文本。

我想

$exploded = str_replace('}{', "}\n{", $file_contents);

够了。

而且文件内容看起来像无效json最好修复它。

你不能这样做,因为你在拆分时删除了分隔符。要么你必须创建更复杂的 preg_split,要么你必须结合替换和拆分。试试这个:

$content = preg_replace('/\r\n|\r|\n/', '', $content);
$content = preg_replace('/}{/', '},{', $content);
$exploded = preg_split('/,/', $content);

您可以简单地遍历字符串字符,根本不涉及 \r\n 字符。找到 {,找到 } 并将它们之间的所有字符都放在 $temp 中,如下所示。

片段:

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

演示: https://3v4l.org/1OFen