【问题标题】:PHP regex - Divide plain text by string objectPHP regex - 将纯文本除以字符串对象
【发布时间】:2019-12-18 14:04:27
【问题描述】:

我有一个包含以下内容的 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"}
)

【问题讨论】:

  • 看起来像无效的 json。
  • 您最好手动编辑一次,并首先修复使您使用这种格式的代码。其他:lookaround.
  • 我编辑了该出版物,因为它不完全正确。该文件是自动进程的输出,文件有很多行。

标签: php regex pcre


【解决方案1】:

您可以简单地遍历字符串字符,而根本不涉及\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

【讨论】:

    【解决方案2】:

    我想

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

    够了。

    由于文件内容看起来像 invalid json,最好修复它。

    【讨论】:

    • OP 说使用正则表达式。
    • @user2342558 许多人没有意识到使用正则表达式的低效率,只是认为它是解决问题的最佳方法。但是,对于像这样的简单情况,通常不是。
    • 正确,但我不认为 OP 要求的方法与他要求的方法不同
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你可以使用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":"..."} 之类的文本。

      【讨论】:

        猜你喜欢
        • 2018-11-04
        • 2019-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-19
        • 1970-01-01
        • 2020-10-08
        • 2017-05-31
        相关资源
        最近更新 更多