Domanda

Bene, ho bisogno di analizzare 2 file di testo. 1 di nome Item.txt e uno di nome Message.txt Sono file di configurazione per un server di gioco, elemento contiene una riga per ogni elemento del gioco, e messaggio ha nomi degli elementi, le descrizioni, i messaggi del server ecc So che questo è di gran lunga inferiore l'ideale, ma non può cambiare il modo in cui funziona, o il formato.

L'idea è in Item.txt ho righe in questo formato

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

Se ho la variabile $item php che è pari a 397 (Index), ho bisogno di ottenere prima il 'nome' (597).

Poi ho bisogno di aprire Message.txt e trovare questa linea

( itemname 597 "Blue Box")

Poi tornare "Blue Box" per PHP come una variabile.

Quello che sto cercando di fare è restituire il nome dell'elemento con indice della voce.

So che questo è probabilmente qualcosa veramente di base, ma ho cercato comunque decine di tutorial funzionamento di file e ancora non riesco a trovare quello che mi serve.

Grazie

È stato utile?

Soluzione

A seguito di metodo in realtà non 'parse' i file, ma dovrebbe funzionare per il vostro problema specifico ...

(Nota: non testato)

Data:

$item = 397;

aperto Item.txt:

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

indice di ricerca $item e ottenere $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 aperto:

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

Ricerca $name e ottenere $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 dovrebbe ora contenere Blue Box:

echo $msg;

Altri suggerimenti

Non sono sicuro se il problema è con l'analisi delle espressioni, o la lettura dei file di per sé dal momento che si parla "tutorial operazione file".

Queste espressioni tra parentesi nei file sono chiamati s-espressioni. Si consiglia di google per un parser s-espressione e adattarlo al php.

Si dovrebbe esaminare la href="http://php.net/manual/en/function.serialize.php" rel="nofollow"> serializzare funzione

serializzazione di questi dati come un array e il risparmio verso il basso per i file di testo permetterebbe di accedervi tramite i tasti di array. Prendiamo il vostro esempio. Come un array, i dati che hai descritto sarebbe simile a questa:

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

serializzazione matrice elemento metterebbe in un formato che possa essere salvato e successivamente accedervi.

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

È quindi possibile caricare il file e unserialize il suo contenuto per finire con lo stesso array. Le funzioni di serializzare e unserialize sono direttamente destinati per questa applicazione.

il primo file di testo ha diverse caratteristiche che è possibile utilizzare per aiutare analizzarlo. Spetta a voi decidere se è ben formato e sufficientemente affidabili per tasto.

ho notato:

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

Metodo A:

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top