首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PHP解析s-expression

用PHP解析s-expression
EN

Stack Overflow用户
提问于 2011-01-21 04:31:32
回答 4查看 518关注 0票数 0

好吧,我需要解析两个文本文件。一个名为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) )

如果我有一个php变量$item,它等于397 (索引),我需要首先得到'name‘(597)。

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

( itemname 597 "Blue Box")

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

我试图做的是返回项目的名称和项目的索引。

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

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-21 05:14:14

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

(注:未测试)

给定:

代码语言:javascript
复制
$item = 397;

打开Item.txt:

代码语言:javascript
复制
$lines = file('Item.txt');

搜索索引$item并获取$name

代码语言:javascript
复制
$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:

代码语言:javascript
复制
$lines = file('Message.txt');

搜索$name并获取$msg

代码语言:javascript
复制
$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

代码语言:javascript
复制
echo $msg;
票数 2
EN

Stack Overflow用户

发布于 2011-01-21 04:45:48

我不确定你的问题是解析表达式,还是阅读文件本身,因为你提到了“文件操作教程”。

文件中的那些括号表达式称为s表达式。你可能想在谷歌上搜索一个s-expression解析器,并把它改编成php。

票数 1
EN

Stack Overflow用户

发布于 2011-01-21 04:46:14

您应该研究一下serialize函数,它允许将数据存储到文本文件中,当需要重新加载数据时,可以很容易地重新解释该格式。

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

代码语言:javascript
复制
$items[397]['name'] = 'bluebox';

序列化项目数组会将其放入一种可以保存并在以后访问的格式。

代码语言:javascript
复制
$data = serialize($items);
//then save data down to the text files using fopen or your favorite class

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4752240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档