0

好吧,我需要解析 2 个文本文件。1个名为Item.txt和一个名为Message.txt,它们是游戏服务器的配置文件,Item包含游戏中每个项目的一行,Message有项目名称、描述、服务器消息等。我知道这远远少于理想,但我无法改变它的工作方式或格式。

这个想法在 Item.txt 我有这种格式的行

(item (name 597) (Index 397) (Image "item030") (desc 162) (class general etc) (code 4 9 0 0) (country 0 1 2) (plural 1) (buy 0) (sell 4) )

如果我有$item等于 397(索引)的 php 变量,我需要首先获取“名称”(597)。

然后我需要打开 Message.txt 找到这一行

( itemname 597 "Blue Box")

然后将“Blue Box”作为变量返回给 PHP。

我想要做的是返回项目的名称和项目的索引。

我知道这可能是非常基本的东西,但是我已经搜索了几十个文件操作教程,但似乎仍然找不到我需要的东西。

谢谢

4

4 回答 4

2

以下方法实际上并不“解析”文件,但它应该适用于您的特定问题......

(注:未测试)

鉴于:

$item = 397;

打开 Item.txt:

$lines = file('Item.txt');

搜索索引$item并获取$name

$name = '';
foreach($lines as $line){ // iterate lines
    if(strpos($line, '(Index '.$item.')')!==false){
        // Index found
        if(preg_match('#\(name ([^\)]+)\)#i', $line, $match)){
            // name found
            $name = $match[1];
        }
        break;
    }
}
if(empty($name)) die('item not found');

打开 Message.txt:

$lines = file('Message.txt');

搜索$name并获取$msg

$msg = '';
foreach($lines as $line){ // iterate lines
    if(strpos($line, 'itemname '.$name.' "')!==false){
        // name found
        if(preg_match('#"([^"]+)"#', $line, $match)){
            // msg found
            $msg = $match[1];
        }
        break;
    }
}

$msg现在应该包含Blue Box

echo $msg;
于 2011-01-20T21:14:14.390 回答
1

由于您提到“文件操作教程”,因此不确定您的问题是解析表达式还是读取文件本身。

文件中的那些括号表达式称为 s 表达式。您可能想在谷歌上搜索一个 s-expression 解析器并将其调整为 php。

于 2011-01-20T20:45:47.523 回答
1

您应该查看serialize函数,该函数允许将数据以 PHP 在需要重新加载时可以轻松重新解释的格式存储到文本文件中。

将此数据序列化为数组并将其保存到文本文件将允许您通过数组键访问它。让我们举个例子。作为一个数组,您描述的数据将如下所示:

$items[397]['name'] = 'bluebox';

序列化项目数组会将其置于可以保存和以后访问的格式。

$data = serialize($items);
//then save data down to the text files using fopen or your favorite class

然后,您可以加载文件并反序列化其内容以得到相同的数组。serialize 和 unserialize 函数直接用于此应用程序。

于 2011-01-20T20:46:14.157 回答
0

第一个文本文件有几个特性可以用来帮助解析它。由您来决定它是否结构良好且足够可靠以启动。

我注意到:

1) a record is delimited by a single line break
2) the record is further delimted by a set of parens () 
3) the record is typed using a word (e.g. item)
4) each field is delimited by parens 
5) each field is named and the name is the first 'word' 
6) anything after the first word is data, delimited by spaces
7) data with double quotes are string literals, everything else is a number

一个方法:

read to the end of line char and store that
strip the opening and closing parens
strip all closing )
split at ( and store in temp array (see: http://www.php.net/manual/en/function.explode.php)
element 0 is the type (e.g. item)
for elements 1-n, split at space and store in temp array.
element 0 in this new array will be the key name, the rest is data
once you have all the data compartmentalized, you can then store it in an associative array or database. The exact structure of the array is difficult for me to envision without actually getting into it.
于 2011-01-20T21:14:10.237 回答