解析具有静态或最大长度值以及多个分隔符的多行文本

问题描述 投票:0回答:4

我有数据希望粘贴到文本框中,它将采用以下形式。

Ryu Aiter D78:21:87:13 177 /177 1 / 6
Ryu Chronos D78:21:26:21 182 /182 0 / 6
Ryu Hermes D78:21:26:22 201 /201 0 / 6
Ryu Hefaistos D78:31:75:10 136 /136 1 / 2
Ryu Krotos D78:84:96:11 170 /170 1 / 6
Ryu Heros D78:65:51:31 175 /175 2 / 5
Ryu Arachnos D78:13:84:11 185 /185 0 / 5

它是这样分割的:

  • 基本(最多 16 个字符)
  • 位置(以 D 开头,12 个字符)
  • 经济/最大经济(整数/整数)
  • 已用/总计(整数/整数)

我想做的是为每行文本创建一个循环, 然后在该循环内将行的每个部分切分成每个组件的变量。

就分离它的想法而言,我知道

:
符号被禁止出现在名称和碱基中。 因此,如果我找到第一个“:”,则后退 2 步并获取接下来的 12 个字符,这就是我的位置。 我知道这可以通过循环来完成并检查
if ($string[$x] === ':')

但是我如何循环这些线呢? 如何分离每行中的其余数据?

php string split text-extraction text-parsing
4个回答
1
投票

这就是正则表达式的用途:P 尝试一下:

$lines = explode( "\r\n", $data );

$users = array();

foreach( $lines as $line )
{
    $matches = array();
    $user = array();

    preg_match( "/([^ ]+) ([^ ]+) ((?:[A-Z])(?:[0-9]+:){3}[0-9]+) ([0-9]+) \/([0-9]+) ([0-9]+) \/ ([0-9]+)/", $line, $matches );

    list(,$user['name'],$user['base'],$user['location'],$user['econ'],$user['maxecon'],$user['used'],$user['total']) = $matches;

    $users[] = $user;
}

您将有一个名为 users 的数组,其中包含一系列与组件关联的数组。就像下面...

Array
(
[0] => Array
    (
        [total] => 6
        [used] => 1
        [maxecon] => 177
        [econ] => 177
        [location] => D78:21:87:13
        [base] => Aiter
        [name] => Ryu
    )

[1] => Array
    (
        [total] => 6
        [used] => 0
        [maxecon] => 182
        [econ] => 182
        [location] => D78:21:26:21
        [base] => Chronos
        [name] => Ryu
    )

etc, etc...

编辑:我对数据做了很多假设,因为你没有提供很多细节,如果你需要表达式的进一步帮助,请告诉我。

根据您的评论更新:

Line 182: $name = htmlspecialchars(mysql_real_escape_string($_POST['name']));
Line 188: $tecon = htmlspecialchars(mysql_real_escape_string($user['econ']));

您应该打开 display_errors,因为它们是可以轻松调试的简单语法错误。


0
投票

你能用爆炸逐渐分解它吗?

例如。

  • 将条目分解为位于 ' 的单独行 '
  • 然后将每一行分解为 2 行,第一个“:”之前的所有内容以及之后的所有内容
  • 使用每个“空间”将第一部分分解为碎片,为您提供名称、基地、位置
  • 使用“空格”、“:”或“/”分解第二部分,得到经济/最大经济和已用/总计

0
投票
if(preg_match_all('/^([a-z]{1,16})\s+([a-z]{1,16})\s+(D\d+):(\d+):(\d+):(\d+)\s+(\d+)\s+\/(\d+)\s+(\d+)\s+\/\s+(\d+)$/mi', $yourinputgoeshere, $match) {
    print_r($match);
}

未经测试,这应该将所有内容放入一个大数组中,分开。未经测试


0
投票

扩展相同的想法,我尝试对另一页上的单行使用预匹配。

我使用代码

            $data = $_POST['list'];

            $matches = array();
            $user = array();            
            preg_match( "/(.+?) ((?:[A-Z])(?:[0-9]+:){3}[0-9]+) ([0-9]+) \/([0-9]+) ([0-9]+) \/ ([0-9]+)/", $data, $matches ); 
            list(,$user['base'],$user['location'],$user['econ'],$user['maxecon'],$user['used'],$user['total']) = $matches;

            $base = $users['base'];
            $location = $users['location'];
            $tecon = $users['econ'];

我使用 echo 打印出 £data ,它包含预期的数据,但是没有行循环的相同代码不会将我的数据部分分隔到数组中。事实上, $user 的数组大小仍然为空,有什么出问题了吗?

© www.soinside.com 2019 - 2024. All rights reserved.