Newsgroup: it.comp.www.php
Titolo: RegExp & amici

Ciao a tutti.
Ho un file di testo così composto (ovviamente è molto più lungo e non è 
presente ----FINE-----FINE----):
Field Value
-----------------------------------------
mac 00:e0:b8:76:28:e0
type AP
privacy On
ssid Purina
channel 6
signal 2
Field Value
-----------------------------------------
mac 00:0e:81:01:01:62
type AP
privacy Off
ssid Internal Instant802 Network
channel 6
signal 1
----FINE---------FINE-------
Ho la necessità, per ogni blocco (delimitato da un Field Value iniziale)
di prendere tutti i valori (mac, type, privacy, etc), che sono variabili 
(possono esserci o meno determinati valori) e di inserirli in 2 tabelle 
mysql.
le due tabelle sono così strutturate (è presente anche un esempio dei 
contenuti:
TABELLA 1:
|id|mac|type|privacy|ssid|channel|signal|
|1|00:e0:b8:76:28:e0|AP|On|Purina|6|2|
|2|00:0e:81:01:01:62|AP|Off|Internal Instant802 Network|6|1|
TABELLA 2:
|id|mac|chiave|valore|
|1|00:e0:b8:76:28:e0|type|AP|
|1|00:e0:b8:76:28:e0|privacy|On|
|1|00:e0:b8:76:28:e0|ssid|Purina|
.....
In sostanza, tabella 1 mi deve inserire un record per ogni 'blocco' 
presente su quel file ma con solo determinati campi predefiniti (che poi 
mi 'filtro' io) mentre invece tabella 2 deve contentenere TUTTI i campi 
presenti su quel file, un record per ogni campo rilevato e identificati 
dal mac che deve essere presente su ogni record.
Qualcuno mi sa dare una mano? sto impazzendo. Credo che la soluzione 
migliore siano le espressioni regolari ma non riesco a cavarci le zampe.
Per la parte mysql non ci sono problemi, il problema è che non riesco a 
separare i campi presenti in base al mac..... avrei bisogno di buttare 
tutto in un array simile a questo
$array['mac']['type'] = "AP"
$array['mac']['privacy'] = "ON"
che poi mi parso con un foreach.....
Grazie 1000 in anticipo

 Grazie 1000 in anticipo
potresti iniziare da qui..
preg_match_all("/(([a-zA-Z_][a-zA-Z0-9_]+)\s+(.+)|\-+)/", $text, $matches);
e poi esaminare $matches..
-- 
www.iuz-lab.info

 preg_match_all("/(([a-zA-Z_][a-zA-Z0-9_]+)\s+(.+)|\-+)/", $text, $matches);
Quant'è bello sapere usare le regex... :-D
Io ho risolto il problema, con un paio di foreach ed explode... :-P
Per chi fosse curioso... 
http://phpfi.com/201242
(ovvio che la soluzione con espressioni regolari è MOLTO più elegante...
non so se è migliore in termini di efficienza - probabilmente sì)
HTH,
David
-- 
         Linux Registered User #334216
Get FireFox! >> 
http://snipurl.com/gofoxygo/
 <<
Blog         >>  
http://www.hanskalabs.net/
  <<
Staff        >> 
http://www.debianizzati.org/
 <<

 Per chi fosse curioso... 
http://phpfi.com/201242
Una sola correzione al codice del link:
$code .= "\$".$result."['$mac']['$mykey'] = \"$myval\";\n";
invece di
$code .= "\$$result['$mac']['$mykey'] = \"$myval\";\n";
(giuro l'ho testato... ma prima dell'ultima modifica... m'è scappato
questo buggozzolo... :-S)


 
Avevo già fatto.
Il problema è che non riesco a portarmi dietro il mac....
Adesso sto facendo dei test con delle variabili di sessione...
ma....... questa regexp non è corretta:
$parametro = "mac 00:e0:b8:76:28:e0";		 
preg_match("/^([a-z]+)[\s|\t]+(.*)/",$parametro,$out);
$out[1] = $chiave;
$out[2] = $valore;
Dovrebbe prendere come $out[1] qualunque carattere compreso tra a e z 
minuscoli ad inizio stringa, e dentro $out[2] tutto il resto fino a fine 
stringa, separato da uno o più spazi oppure uno o più tabulazioni..........
Eppure non funge.

 questo buggozzolo... :-S)
MITICCCCCOOOOOOOO
proprio quello che volevo.
Grazie.

 Grazie.
Prego. ;-)


 
-- 
www.iuz-lab.info

 sicurezza..
Beh. Se è uno script da usare in locale...
Ma se è un qualcosa da integrare via web hai ragione. Mo' magari provo
ad implementare con la tua regex :-)


 sicurezza..
Deve venire eseguito in locale tramite linea di comando.

 non cantar vittoria ;-)..
http://phpfi.com/201256
;-)
Cheers,


 
Ciao a tutti
Ho riadattato la regexp per poter 'beccare' anche i campi con "-" però 
non riesco a far comprendere anche i campi senza valore.
num_beacons, ad esempio, non contiene dati. e la regexp continua fino 
alla riga successiva.
(ovviamente i campi vuoti possono variare)
Regexp adattata:
/(([a-zA-Z_][a-zA-Z0-9_\-]+)[\s|\t]+(.+)|[\-]{5,})/
File
Field            Value
------------------------------------------------------------------
mac              00:40:f4:f6:f9:1c
beacon-interval  100
capability       0x31
type             AP
privacy          On
ssid             GestioneRistorante
wpa              Off
phy-type         7
band             2.4
channel          6
rate               1
signal           -1
erp              0x3
num_beacons
last-beacon      Wed Feb 14 14:20:36 2007
supported-rates  [82][84][8b][96][0c][12][18][24][30][48][60][6c]
Field            Value
------------------------------------------------------------------
mac              00:18:4d:bd:80:22
beacon-interval  100
capability       0x401
type             AP
privacy          Off
ssid             NETGEAR - 0
wpa              Off
phy-type         7
band             2.4
channel          9
rate               1
signal           2
erp              0x0
num_beacons
last-beacon      Wed Feb 14 14:47:24 2007
supported-rates  [82][84][8b][96][0c][18][30][48][12][24][60][6c]

 (ovviamente i campi vuoti possono variare)
Forse ho risolto cosi:
/(([a-zA-Z_][a-zA-Z0-9_\-]+)[\s|\t]{1,}(.+)|[\-]{5,})/
In questo modo DEVE essere presente almeno 1 spazio o 1 tabulazione, 
altrimenti il campo viene ignorato.
E' corretto?