PHP中的字符串解析器/分离

时间:2009-07-23 09:55:56

标签: php string

我有数据,我希望将其粘贴到文本框中,它将采用E.G

的形式
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个字符)
econ / max econ(int / int)
used / Total(int / int)

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

就分离它的想法我知道:符号被禁止使用名称和基础。 所以,如果我找到第一个“:”然后退回2并接下来的12个字符,这是我的位置 我知道可以用until循环和if(string [x] =':')

来完成

但是我如何循环遍历行? 我怎么能连续分开剩下的数据呢?

4 个答案:

答案 0 :(得分: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,因为它们是可以轻松调试的简单语法错误。

答案 1 :(得分:0)

您可以使用explode并逐步将其分解吗?

例如。

  • 在“\ n”
  • 中将条目分成单独的行
  • 然后将每一行爆炸为2,在第一个':'之前的所有内容,以及
  • 之后的所有内容
  • 使用每个“空格”将第一部分分成几部分,为您提供名称,基地,位置
  • 使用'space',':'或'/'爆炸第二部分给你econ / max econ和used / Total

答案 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);
}

这应该是未经测试的,将所有内容都分成大数组。未经测试

答案 3 :(得分:0)

扩展同样的想法我试图在另一页上使用preg匹配单行。

我使用代码

            $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打印出£数据并且它包含了预期的数据但没有行循环的相同代码没有将我的数据部分分离到数组中..实际上$ user的数组大小仍为空, wroung已经发生了什么?