Newsgroup: it.comp.www.php
Titolo: Come riconoscere se una stringa e' un' ORA ?

Salve a tutti !!
Ho un file di testo cosi' formato:
21:00
FILM - [2]Il compagno Don Camillo
(Commedia)
Regia di Luigi Comencini con Fernandel, Gino Cervi, Graziella Granata
Italia 1965 
23:10
VARIETA' - Immagine
con Emanuela Folliero
(mi fermo qua, ma continuerebbe sempre in modo analogo)
Leggendo il file riga per riga dovrei valutare se al riga che "ho in
mano" in quel momento e' o non e' un orario.
Cio' mi serve per riconoscere dove inizia e dove finisce uno spettacolo,
cosi' da forammatare la tabella di conseguenza.
Semplice Esmepio:
[....]
echo "<table>
<tr>
<td>
	<b>Programmazione serale</b>";
$riga=trim($riga);
if ($riga "e' un ora" ?) {
	echo "
		</td>
		</tr>
		<tr>
		<td>
			<b>$riga</b>";
} else {
	echo "$riga";
}
[....]
Spero di essere riuscito a spiegarmi, nel caso non ce l'avessi fatta
rimango disponibile per chiarirmi maggiormante.
Saluti
	MaX


Ciao, prova con qualcosa di simile
<?php
$ora=date("h");
$orat="$ora:";
if (($ora<24) || ($ora>0) || ($orat=="$ora:")){
echo "Riga è un ora";
} else {
echo "Riga non è un ora";
}
?>
Ciao
FL

 mano" in quel momento e' o non e' un orario.
<?php
 $pattern='/^[0-2][0-9]:[0-5][0-9]$/';
 if ( preg_match($pattern,$riga) ) {
   //nella riga c'è un orario
 }
?>
dai un occhiata qui:
http://www.php.net/manual/en/ref.pcre.php
http://www.php.net/manual/en/ref.regex.php
_SV_

  $pattern='/^[0-2][0-9]:[0-5][0-9]$/';
A voler esser pignoli, pero', questa regexp ti matcha anche i numeri dal 24
al 29. Quindi un 29:58 risulterebbe un'ora validissima.
Inoltre non matcha orari mattutini, tipo 9:00, a meno che non siano
preceduti da uno zero.
Se non interessa "un lavoro di fino", si puo' anche semplificare il tutto
con un:
^\d{1,2}:\d{1,2}$
Altrimenti, sperando di non scrivere cavolate, questa regexp dovrebbe
risolvere i succitati diffetti:
$pattern='/^(([01]?[0-9])|(2[0-3])):[0-5][0-9]$/';
Probabilmente e' ottimizzabile, l'ho scritta on the fly.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
Come devo regolare la stampante laser per stordire?
(How do I set a laser printer to stun?)

 Probabilmente e' ottimizzabile, l'ho scritta on the fly.
In effeti non 'matcha', per esempio, le 3:5 del mattino.
;-)
_SV_

 ;-)
E' voluto. 3:05 e' un formato riscontrabile, e la regexp precedente non lo
"matchava". 3:5 e' difficile che sia considerato un formato "temporale"
quanto piu' una proporzione. Un esempio? 16:9 con 16:09.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
Le donne si dividono in 4 categorie: le suore (non la danno a nessuno);
le puttane (la danno a tutti); le stronze (la danno a tutti tranne che 
a te); le rompiballe (la danno a te e solo a te).

 quanto piu' una proporzione. Un esempio? 16:9 con 16:09.
beh...
credo comunque che il problema stia nel conoscere il formato in cui viene scritta l'ora nel  file.
Se infatti, non esiste un controllo a monte e l'ora viene immesse manulamente da un utente, allora bisognerebbe supporre, per
esempio,
anche come valida una data nel formato 16:9,
o anche 16: 09 (con uno o piu spazi), o solo 16, ecc
la nostra regexp potrebbe diventare molto complessa.
ciao
_SV_

 la nostra regexp potrebbe diventare molto complessa.
Non piu' di tanto, in realta'.
Ma il punto e' un altro: Il fatto e' che non possiamo prendere qualcosa
come 16:9 come un orario valido, nel momento in cui stiamo cercando di
capire se una certa stringa "non nota" *puo'* essere un orario o meno.
Questo genere di operazioni infatti si fanno quando devi parserizzare il
contenuto di un file su cui non hai possibilita' di mettere mani (es, il
risultato di una chiamata http ad un server tramite socket).
Presumibilmente, quindi, se trovi qualcosa come 3:5 non e' da considerare
un formato temporale: e' difficile riscontrare un'ora scritta in questo
modo, concordi?
E' piu' facile che si tratti di un rapporto, o di una proporzione.
Se trovi invece qualcosa come 03:05, o 3:05, al contrario, e' piu' facile
(notare il "piu' facile".. nel fare parsing di file esterni spesso non vi
sono certezze matematiche) che si tratti di un formato temporale.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
Come devo regolare la stampante laser per stordire?


 sono certezze matematiche) che si tratti di un formato temporale.
ovviamente si...
Stiamo un po divagando.
Riassumo dicendo che hai ragione quando affermi che bisogna utilizzare un formato
corretto e conosciuto di ora quando deve essere usato come pattern all'interno
di una ricerca  su delle informazioni non conosciute...
ma se il tipo di file struttura una serie di formazioni già note,
il pattern in questione puo tenere conto di formati un po diversi da quelli
'corretti'
Spero di essere stato chiaro.
Ciao
_SV_

 Spero di essere stato chiaro.
Ma allora si ritorna al discorso che ho fatto inizialmente:
Se prendi per buono un formato tempo come 3:5, allora non necessi di
"andare di fino", e puoi benissimo adottare una semplicissima regexp come
^\d{1,2}:\d{1,2}$ dato che, come dici tu, non vi sono altre stringhe che
possono matchare quella particolare condizione.
Insomma, riassumendo: se si vuol fare le cose "per bene", allora un formato
come 3:5 non e' da considerarsi un orario valido, cosi' come 26:56 o 16:9.
Se invece non interessa andare cosi' nel dettaglio, allora e' preferibile
usare una regexp molto piu' semplice senza complicarci inutilmente la vita
aggiungendo dei range che sono, comunque, incompleti (vedasi 26:xx).
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"Lo dice il buon senso, ma il buon senso non e' uno standard".
(Jeffrey Zeldman)

 e' sicuramente sbagliato. Non e' uno standard valido.
Sono pienamente d'accordo sul fatto che quel formato di ora non è valido.
E sono consapevole anche  che è importante rispettare degli standard nell'ambito dello scambio di informazioni.
Ma quello che voglio dire, relativamente a questo caso,
è che finchè non possiamo controllare l'input delle informazioni e
finchè ancora conosciamo la struttura del file,
ci possiamo 'permettere' di effettuare un controllo meno restrittivo su alcune informazioni:
in quanto, sempre in riferimento all'esempio, se è stata inserita erroneamente
un formato di ora non valido (il nostro 16:9) il tipo di informazione (e non il tipo di dato, cioè il formato dell'ora) non cambia:
infatti si vuole comunicare cmq un orario, è cioè le quattro e nove di pomeriggio, anche se è stato scritto erroneamente.
Se tentiamo di rispecchiare il formato valido (sempre e solo in questo esempio)
il risultato del parsing sarà errato perche lo spettacolo delle 16 e 9 non verrà
visualizzato, mentre lo doveva.
E se l'ora è '29:23'? come ci comportiamo?
Se no la 'matchiamo' rischiamo di accodarla all'evento di prima e quindi di generare un oputput confusionario...
dovremmo cmq 'matcharla' e decidere se visualizzare tutto l'evento (eventualemente con un avviso) o meno...
relativamente al problema proposto al gruppo non si tratta quindi solamente
di decidere o meno se usare come pattern un formato standar o meno...
il tutto dipende sempre dai fine dell'applicazione...
ed in questo caso ritengo opportuno non usare un formato 'standard',
anche se bisognerebbe fare un'analisi completa sull'applicazione per non incorrere
in problemi di formato che in futuro, come hai giustamente sottolineato, potrebbero nascere
ciao
_SV_

 con Emanuela Folliero
Ottime le soluzioni di Radar e ZERO, istruttiva la discussione.
Un'alternativa può essere questa:
$temp=explode(":",trim($riga));
if  (count($temp==2))
     if (($temp[0]>=0) && ($temp[0]<24))
         if (($temp[1]>=0) && ($temp[1]<60))
             print "è un orario!";
naturalmente migliorabile.
Ciao
-- 
Spoken: How much is that gorilla in the window?
Take our advice, At any price, A gorilla like Magilla is mighty nice.
Gorilla, Magilla Gorilla for sale

 ed in questo caso ritengo opportuno non usare un formato 'standard'
Questione di punti di vista. Io lo preferisco per evitare di ritrovarmi in
futuro con un codice che mi prende il formato sedici noni come le quattro e
nove del pomeriggio..
Se decido invece che non e' opportuno usare "formati standard" perche'
l'output potrebbe essere fallace da quel punto di vista, non sto neanche a
sprecare tempo a definire una regexp come dio comanda, ma - come ho gia'
detto - cerco solo una riga che contiene due numeri separati dai due punti,
che siano entrambi di una o due cifre.
Non ha senso fare le cose a meta', e si deve mantenere un certo livello di
coerenza. Se il controllo deve essere fatto per cercare il formato orario,
allora cosi' deve essere. Se invece deve essere piu' "libertino" perche'
l'input puo' essere errato, allora non ha senso inserire regole a meta'.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
Il computer e' una macchina progettata per velocizzare e automatizzare 
gli errori.

 cosi' da forammatare la tabella di conseguenza.
Come consigliato da Radar e Zero, usa un'espressione regolare, č il metodo
piů rapido e "pulito"
Per esempio questa riconosce le ore in formato h:mm o hh:mm
$regexp = "^([0-1][0-9]|[2][0-3]):([0-5][0-9])$";
Se ti servono espressioni regolari un'ottima risorsa č il sito (in inglese)
http://www.regexplib.com/
da cui ho tratto la succitata espressione. Inoltre č presente un ottimo
motore di test (in Javascript o .Net) per provare le proprie espressioni o
quelle proposte nella libreria.
Saluti
LB

Grazie a tutti.
Ho risolto come da voi suggerito con le espressioni regolari.
(quella proposta da ZERO).
Ciao
	MaX