【问题标题】:PHP - explode or preg_split to arrange an arrayPHP-explode 或 preg_split 排列数组
【发布时间】:2025-12-28 06:55:11
【问题描述】:

我的数组有一些问题

我有一个 .txt 文件,我用

将其添加到 php 文件中
$file = file_get_contents('data.txt');

data.txt 包含此格式的列表:

<info1 info2 0.10s [info: info] 10.10.10.10:80>
<info1 info2 0.10s [info: info, info] 10.10.10.10:80>
<info1 info2 0.10s [info:80, info:25] 10.10.10.10:80>
<info1 info2 0.10s [info: info, info, info:80, info:25] 10.10.10.10:80>
and so on

然后我正在使用:

$lines = explode("\n", $file);

我可以使用而不是使用 explode 和 file_get_contents

$lines = file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

如果我这样做:

echo '<pre>';
print_r ($lines);
echo '</pre>';

我得到了这个数组

Array
(
    [0] => 
    [1] => 
    [2] => 
    [3] => 
    ....
)

我正在努力让数组看起来像这样,以便我可以 foreach 并显示信息或将其添加到数据库中

Array 
(

info1
info2
time
info *whats inside the []
ip

)

非常感谢任何帮助。提前感谢您对此进行调查!


首先,我正在努力让 foreach 工作

foreach($lines as $line => $data)
{
$lines_data = explode(' ', $data); //here i've tried to use preg_split with regex and i'm unable to get it to work

$info[$line]['info1'] = $lines_data[0];
$info[$line]['info2'] = $lines_data[1];
$info[$line]['time'] = $lines_data[2];
$info[$line]['info'] = $lines_data[3];
$info[$line]['ip'] = $lines_data[4];

echo ' info1: ' . $info[$line]['info1'] . '<br />';
echo ' info2: ' . $info[$line]['info2'] . '<br />';
echo ' time: ' . $info[$line]['time'] . '<br />';
echo ' info: ' . $info[$line]['info'] . '<br />';
echo ' ip: ' . $info[$line]['ip'] . '<br />';
}

它不能以这种方式工作,因为 explode(' ', $data); 被空格分割,我在 [ ]

之间也有空格

【问题讨论】:

  • 查看页面的实际来源。 &lt; 会导致浏览器开始呈现为 html,如果你想显示它,你需要遍历带有 htmlentities 的数组,pre 标签不会帮助你。另外你最好使用file()
  • $lines = explode(PHP_EOL, $file);你会试试这个吗?
  • 文件中的数据究竟是什么?我会先把它解析成一个数组,然后对数组进行排序。
  • $lines = explode(PHP_EOL, $file);也在工作,所以.txt文件没有问题,问题出在数组格式上,因为我无法将它转换成我需要的格式,所以我可以将它添加到我的数据库中,所以我假设我需要从行中删除 并使用 preg_split 和正则表达式来拆分内容
  • $row 设置在哪里?您需要展示一个实际行的示例,因为 info 不是它,加上空格分隔会将您限制为单个单词,因此任何答案很可能是错误的。

标签: php regex


【解决方案1】:

试试这个:

<?php
$lines = file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach($lines as $line) {
    preg_match('#<(\w+)\s(\w+)\s(.+)\s\[(.+)\]\s(\d+\.\d+\.\d+\.\d+:\d+)>#', $line, $match);

    $info[] = [
        'info1' => $match[1],
        'info2' => $match[2],
        'time' => $match[3],
        'info' => $match[4],
        'ip' => $match[5],
    ];
}

print_r($info);

很可能不适用于您的真实数据,但我要求提供示例行但似乎被忽略了。

https://3v4l.org/62UaD

结果:

Array
(
    [0] => Array
        (
            [info1] => info1
            [info2] => info2
            [time] => 0.10s
            [info] => info: info
            [ip] => 10.10.10.10:80
        )

    [1] => Array
        (
            [info1] => info1
            [info2] => info2
            [time] => 0.10s
            [info] => info: info, info
            [ip] => 10.10.10.10:80
        )

    [2] => Array
        (
            [info1] => info1
            [info2] => info2
            [time] => 0.10s
            [info] => info:80, info:25
            [ip] => 10.10.10.10:80
        )

    [3] => Array
        (
            [info1] => info1
            [info2] => info2
            [time] => 0.10s
            [info] => info: info, info, info:80, info:25
            [ip] => 10.10.10.10:80
        )

)

【讨论】:

  • 它工作得很好,非常感谢您通过编写 preg_match() 正则表达式所做的解释