好吧,我需要解析两个文本文件。一个名为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。
我试图做的是返回项目的名称和项目的索引。
我知道这可能是非常基本的东西,但我已经搜索了几十个文件操作教程,似乎仍然找不到我需要的东西。
谢谢
发布于 2011-01-21 05:14:14
下面的方法实际上并不能“解析”文件,但它应该适用于您的特定问题……
(注:未测试)
给定:
$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-21 04:45:48
我不确定你的问题是解析表达式,还是阅读文件本身,因为你提到了“文件操作教程”。
文件中的那些括号表达式称为s表达式。你可能想在谷歌上搜索一个s-expression解析器,并把它改编成php。
发布于 2011-01-21 04:46:14
您应该研究一下serialize函数,它允许将数据存储到文本文件中,当需要重新加载数据时,可以很容易地重新解释该格式。
将此数据序列化为数组并将其保存到文本文件中将允许您通过数组键访问它。让我们以你的例子为例。作为一个数组,您所描述的数据将如下所示:
$items[397]['name'] = 'bluebox';序列化项目数组会将其放入一种可以保存并在以后访问的格式。
$data = serialize($items);
//then save data down to the text files using fopen or your favorite class然后,您可以加载该文件并对其内容进行反序列化,以得到相同的数组。serialize和unserialize函数直接用于此应用程序。
https://stackoverflow.com/questions/4752240
复制相似问题