Newsgroup: it.comp.www.php
Titolo: Espressioni regolari

Problema con le espressioni regolari.
Vorrei controllare che una stringa fosse composta solo da lettere e numeri e
('_') e che il primo carattere fosse una lettera.
Non ci sto riuscendo...
eregi("^[a-z]([a-z]|[0-9]|_)*", $stringa);
cosa c'è di sbagliato?
e come si fa allora?
grazie a tutti

In DL5W7.363700$
sq5.17...@news.infostrada.it
, federico,


Prova questo:
<?php
    $stringa[0] = "Stringa di prova";
    $stringa[1] = "44 gatti in fila per tre col resto di due";
    for($i = 0; $i < count($stringa); $i++)
        {
            if(eregi("(^[a-z]{1})([a-z0-9_ ]*)", $stringa[$i]))
                { echo "La stringa &egrave; corretta<br>\n"; }
            else
                { echo "La stringa non &egrave; corretta<br>\n"; }
        }
?>
Ciao
:) Roberto

 ha scritto nel messaggio
news:DL5W7.363700$sq5.17...@news.infostrada.it...


 Provo grazie.
Occhio che, nel mio modello, l'atomo ([a-z0-9_ ]*) accetta anche gli spazi e
nessuna occorrenza di caratteri alfanumerici. Se vuoi escludere gli spazi e
imporre la presenza di ALMENO un carattere della classe definita fra le [ ]
devi cambiarlo in ([a-z0-9_]+).
ri-ciao
:) Roberto

 $stringa[1] = "44 gatti in fila per tre col resto di due";
Mi fanno notare che i gatti erano in fila per sei e non per due .. scusate,
quando uscì quella canzone ero bambino e contavo malissimo :-)))
:) Roberto

 ha scritto nel messaggio
news:B84EB304.674C%rodic...@tiscalinet.it...


 ha scritto nel messaggio
news:B84F4462.6753%rodic...@tiscalinet.it...


 regolari?
Premesso che la tua soluzione funzionava da un punto di vista sintattico,
beh, io non sono un'esperto di RegExp: posso dirti che pressoché tutto
dipende dal presupposto logico con cui le costruisci.
Fra l'altro sto notando che forse nemmeno la mia è del tutto adatta ai tuoi
scopi. In effetti non esclude affatto la possibilità che dopo la prima
lettera iniziale si presentino segni di interpunzione non desiderati, perché
il quantificatore * si accontenta di ZERO O PIU' presenze fra caratteri
alfanumerici e/o underscore:
    eregi("(^[a-z]{1})([a-z0-9_ ]*)", $stringa[$i])
Qualcosa di meglio potrebbe essere questo:
    eregi("(^[a-z]{1})([^[:punct:]]|[a-z0-9_]+)", $stringa)
Questa esige un solo carattere alfabetico all'inizio, cui segue la
condizione OR:
    ([^[:punct:]]|[a-z0-9_]+)
che in pratica dice: "o è un carattere alfanumerico, o è un underscore
oppure NON E' un carattere di punteggiatura".
A questo facciamo seguire:
    ([^[:punct:]]*$)
che dice: "la stringa NON deve chiudersi con un carattere di punteggiatura".
Ecco: tutto questo è senz'altro migliore della mia soluzione precedente, ma
ha ancora un difetto: se la tua esigenza è quella di avere ALMENO un
carattere alfanumerico e ALMENO un underscore, ancora non ci siamo.
Per quanto riguarda i tutorial sulle RegExp io li ho studiati sui libri in
commercio, ma adesso vorrei acquistare "Mastering Regular Expressions",
pubblicato da O'Reilly e che mi dicono essere il top della manualistica.
Ciao
Roberto

 eregi("(^[a-z]{1})([^[:punct:]]|[a-z0-9_]+)", $stringa)
CORREZIONE (avevo dimenticato l'ultimo "atomo"):
eregi("(^[a-z]{1})([^[:punct:]]|[a-z0-9_]+)([^[:punct:]]*$)", $stringa)
ciao
Roberto

Scusa, ti scrivo in privato perché altrimenti fra correzioni e ripensamenti
il NG si potrebbe intasare.
Il fatto è che se hai bisogno di verificare la presenza di soli caratteri
alfanumerici e di underscore in una stringa, è facile.
Se devi esigere che ci sia almeno una lettera, almeno un numero e almeno un
underscore, la cosa è più complessa :-)
Ciao
Roberto

ereg( "[a-zA-Z]{1}.[a-zA-Z0-9_]*$", $stringa )
Ciao, Luca

 eregi("(^[a-z]{1})([^[:punct:]]|[a-z0-9_]+)([^[:punct:]]*$)", $stringa)
Facciamo le cose semplici, vah:
(preg_match("/^[a-zA-Z][\\w\\s]+$/", $stringa)
e non se ne parla più! ;-)
Ciao
--ev 

 (preg_match("/^[a-zA-Z][\\w\\s]+$/", $stringa)
Questa però gli accetta anche la stringa
        $stringa = "a_1aBD;e"
e poi il cliente gli pianta un casino ;-)))
Secondo me devi per forza escludere i segni di interpunzione ponendo una
condizione logica OR.
Ciao
:) Roberto

 condizione logica OR.
La mia regexp si legge come: una stringa che inizia con una lettera
maiuscola o minuscola, seguita da uno o piů caratteri quali: lettere
maiuscole e minuscole, numeri, underscore (\\w) o spazi (\\s). E che
finisce li ($) ! ;-)
OR non mi sembra che ne servano!
Non l'ho provata a fondo, ma mi sembra che possa andare! :-)
Ciao
--ev

 regolari?
man 7 regex (sotto Unix)
meglio il manuale di PHP su respressioni regulari perl (preg invece di ereg)
Googleando con "espressioni regolari tutorial php ziobudda" trovi un
tutorial abbastanza buono

 Non l'ho provata a fondo, ma mi sembra che possa andare! :-)
Secondo me (correggimi se sbaglio) siamo punto e a capo: anche se il
quantificatore + richiede a fine stringa uno o più segni della classe [\w\s]
è sufficiente che almeno un carattere alfanumerico, di underscore o uno
spazio siano presenti a fine stringa per convalidarla tutta.
Ciao
:) Roberto

 spazio siano presenti a fine stringa per convalidarla tutta.
Non mi sembra (ma non ci giurerei sul tuo cane!): in teoria (ormai il
condizionale è d'obbligo!) la regexp dovrebbe accettare una lettera come
primo carattere (e qui ci siamo) seguita da una serie di lettere, numeri
ed underscore fino alla fine della stringa. In toeria, il "seguita da"
e "fino alla fine" non lascia spazio ad altri caratteri (ed infatti ne
ho conferma dalla prova con quelle 2 righe di codice lì sopra)
Ma a sto punto devo dire che mi hai messo un bel dubbio: ma ho provato
anche in perl ed il risultato non cambia:
$_ = "a_1aBDe";
/^[a-zA-Z][\w\s]+$/ && print "va bene";
Stamp "va bene", altrimenti non stamperebbe niente!
Mah ... 8-)
Ciao
--ev

 }
Certo 'non va bene', il ';' in $stringa fa fallire la preg, nel tuo esempio
perl non c'e'... :)

 perl non c'e'... :)
Gią :-)
Ciao
Roberto
PS - stamattina ho sbirciato il manuale "Mastering Regular Expressions"
pubblicato da O'Reilly, ma per il momento l'ho abbandonato sullo scaffale
:-)
In compenso ho acquistato "Sviluppare applicazioni per database con
mySQL/PHP" di Jay Greenspan e Brad Bulger, ed. Apogeo. Sembra piuttosto
buono.

 perl non c'e'... :)
 
Come dire ... sono uno scemo! :-))
Cmq, correggendo la stringa in Perl, il risultato è che lo script non
stampa niente, quindi lo stesso comportamento (una stringa con un ; in
mezzo) è verificato con php e con perl.
Non so perchè a Roberto dia il risultato contrario ... 
Ripeto ... Mah! 
Ciao
--ev

 ha scritto nel messaggio news:ahpi0a...@127.0.0.1...



equivale a questa:
"^[a-z][a-z0-9_]*$"

 eregi("^[a-z]([a-z]|[0-9]|_)*$", $stringa);
Non l'ho testata a fondo, ma sembra funzionare!
Solo un paio di cosa (chiamatemi pure rompicogl.......): ci sono due "OR" 
nella regexp, cosa che rallenta *notevolmente* la compilazione dello script.
Meglio sarebbe utilizzare \\w che comprende tutte le lettere minuscole e
maiuscole, i numeri e l'underscore!
E poi, molto probabilmente le parentesi tonde che hai utilizzato non
servono a niente, a meno che ti interessi lavorare sulla stringa privata
del primo carattere!
Da ultimo, puoi scrivere in maniera piů leggibile e sicuramente piů
veloce:
eregi("^[a-z][a-z0-9_]*$");
che ha lo stesso effetto della tua!!
Ciao
--ev