Question

Eh bien, je dois analyser 2 textfiles. 1 nommé Item.txt et un nom Message.txt Ce sont des fichiers de configuration pour un serveur de jeu, l'article contient une ligne pour chaque élément dans le jeu, et le message a des noms d'article, les descriptions, les messages du serveur, etc. Je sais que cela est beaucoup moins que idéal, mais je ne peux pas changer la façon dont cela fonctionne, ou le format.

L'idée est Item.txt Je lignes dans ce format

(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) )

Si j'ai la $item variable php qui est égal à 397 (indice), je dois d'abord obtenir le 'nom' (597).

Alors je dois ouvrir Message.txt et trouver cette ligne

( itemname 597 "Blue Box")

Revenez ensuite "Blue Box" pour PHP comme variable.

Ce que je suis en train de faire est de retourner le nom de l'élément avec Index de l'élément.

Je sais que c'est probablement quelque chose de vraiment de base, mais je l'ai recherché si des dizaines de tutoriels d'exploitation de fichiers et ne peuvent toujours pas à trouver ce que j'ai besoin.

Merci

Était-ce utile?

La solution

Après méthode ne « parse » pas réellement les fichiers, mais cela devrait fonctionner pour votre problème spécifique ...

(Note: non testé)

Vu:

$item = 397;

ouvert Item.txt:

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

Index de recherche $item et obtenir $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 ouvert:

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

recherche $name et obtenir $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 doit maintenant contenir Blue Box:

echo $msg;

Autres conseils

Je ne sais pas si votre problème est avec l'analyse syntaxique des expressions, ou la lecture de fichiers en soi puisque vous mentionnez « tutoriels d'opération de fichier ».

Les expressions entre parenthèses dans vos fichiers sont appelés s-expressions. Vous pouvez google pour un analyseur s-expression et l'adapter à php.

Vous devriez regarder dans la fonction serialize , qui permet de stocker des données à un fichier texte dans un format que PHP peut facilement réinterpréter quand il a besoin d'être rechargé.

sérialisation ces données comme un tableau et l'enregistrer jusqu'à la textfiles vous permettra d'y accéder par les clés du tableau. Prenons votre exemple. Comme un tableau, les données que vous décrivez ressemble à quelque chose comme ceci:

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

sérialisation le tableau de l'article mettrait dans un format qui pourrait être sauvé et plus tard accessible.

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

Vous pouvez ensuite charger le fichier et désérialisable son contenu de se retrouver avec le même tableau. Les fonctions de sérialisation et unserialize sont directement destinés à cette application.

le premier fichier texte a plusieurs caractéristiques que vous pouvez utiliser pour l'analyse syntaxique. Il vous appartient de décider si elle est bien formé et suffisamment fiable pour touche.

Je remarque:

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

Procédé:

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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top