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);
我有一个 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);