Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [ preg_match ] ..due espressioni a confronto: dov'è l'errore?

    Buona giornata a tutti carissimi,

    ho un quesito. Ho un input/text dove inserire un URL completo. Questo URL deve rispettare una precisa sintassi.

    Deve rispettare una sola delle seguenti sintassi che è possibile digitare:

    1) http://www.sitoweb.it
    2) http://www.sitoweb.blog.it

    E questo il form per testare il tutto.
    (Nome file: prova.php)

    codice:
    <html>
    <head>
    	<title></title>
    </head>
    
    <body>
    
    <div>
    Prova:
    <form method="post">
    	<input name="testo" type="text">
    	<button name="invia" type="submit">Vai</button>
    </form>
    <?php
    if (isset($_POST['invia'])) {
    
    $prova = $_POST['testo'];
    
    	if (!preg_match('/^(http:\/\/)(www.)([a-z0-9-]+)(\.{1})([a-z]{2,4})$/i', $prova) Xor !preg_match('/^(http:\/\/)(www.)([a-z0-9-]+)(\.{1})([a-z0-9-]+)(\.{1})([a-z]{2,4})$/i', $prova)) {
    	
    	echo ("Errore");
    	
    	} else {
    	
    	echo ("Ok");
    	
    	}
    
    }
    ?>
    </div>
    </body>
    </html>

    Come potrete notare faccio un confronto tra due "preg_match". Ma sono sicuro che sbaglio in qualcosa..perchè in effetti il risultato è sempre "Errore".

    Il risultato deve essere: "o mi dai come corretta la prima sintassi...oppure l'altra. Fuori da queste due sintassi, tutto dà come risultato ERRORE"

  2. #2
    Prima di tutto perche' mai usi l'operatore XOR? La logica di quel controllo chiede un AND: se non e' verificata la prima condizione E non e' verificata nemmeno la seconda allora stampa errore. Puoi usare XOR se inverti i controlli (togli i not prima dei preg_match) ma non ha comunque senso usarlo invece di OR.

    Poi le tue espressioni contengono un sacco di roba inutile: intanto nessuna delle parentesi che hai messo serve a qualcosa. Poi "\.{1}" e' la stessa cosa che scrivere semplicemente "\.". Infine il tutto si puo' racchiudere in una sola espressione:

    codice:
    if (!preg_match('#^http://www(?:\.[a-z0-9-]+){1,2}\.[a-z]{2,4}$#i', $prova)) {
        echo ("Errore");
    } else {
        echo ("Ok");
    }

  3. #3
    Cavolo..vero! Lo dicevo che il mio sapere in tema di espressioni regolari non è ottimale

    Ti ringrazio molto K.B. ho inserito l'espressione da te proposta e funziona alla perfezione!!!

    Probabilmente ero rimasto "abbagliato", sbagliando, dalla logica di XOR (vedi la prima opzione sennò la seconda opzione..). Ora è tutto chiaro..anzi..implementato

    Grazie ancora!

  4. #4
    La logica XOR non e' proprio cosi'. XOR e' un controllo logico particolare, che risulta vero solo se UNA SOLA delle due condizioni e' vera, mentre risulta falsa se sono vere entrambe. Chiaramente e' per definizione inutile usarlo quando le due condizioni non possono mai verificarsi contemporaneamente (XOR controlla sempre entrambe le condizioni, OR no), e da' il risultato opposto a cio' che normalmente ci si attende quando questo accade (in genere se entrambe le condizioni sono vere ti interessa che sia vero anche il risultato finale).

  5. #5
    Grazie mille dell'indicazione. Approfitto, e poi non ti stresserò più riguardo questo argomento, per esporti altre espressioni regolari utilizzate per i miei scopi.

    (Chiaramente, se vuoi e puoi altrimenti non fa niente )

    Seguono le espressioni regolari che ho formulato:

    1) - Per solo testo --> if (!preg_match('#^[a-zA-z]+$#i', $nome))

    2) - Per soli numeri --> elseif (!preg_match('#^[0-9]+$#i', $telefono))

    3) - Per indirizzo email --> elseif (!preg_match('#^[a-zA-Z0-9][_\.a-z0-9-]+@([a-z0-9][0-9a-z-]+\.)+([a-z]{2,4})$#i', $email))

    4) - Per URL sito web --> Me l'hai risolta tu


    Utilizzo una formula corretta per i scopi di cui i primi 3 punti?

  6. #6
    1) dipende da cosa intendi per solo testo, quell'espressione consente solo caratteri da "a" a "z", escludendo quindi lettere accentate ed altri simboli dipendenti dalla lingua, punteggiatura etc. Puo' essere corretta o no a seconda di cosa ti serve
    2) [0-9] si puo' scrivere anche \d
    3) no, vedi: http://forum.html.it/forum/showthrea...4#post13284194

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2009
    Messaggi
    62
    Se volete testare le vostre espressioni regolari, vi consiglio caldamente questo sito:
    http://gskinner.com/RegExr/

    Ovviamente fate riferimento a preg, ereg secondo me non ha senso alcuno.
    (A dire il vero, preg è anche più completo di quel che offre il sito che ho fornito.)

  8. #8
    Cavolo..effettivamente non avevo pensato alle lettere accentate. Per meglio dire, se dovesse capitare che un utente francese digiti il suo nome (con lettere accentate)...ciò comporterebbe un errore di digitazione..giustamente.

    Comunque noto che il punto 2) è corretto. Rimangono il punto 1) [Che riguarda un campo "Nome" e "Cognome" che dovrà contenere necessariamente SOLO lettere] e il punto 3) [Che riguarda l'indirizzo email...e qui...potrei anche lasciare il codice così come l'ho messo...tanto se qualcuno posta un indirizzo email non valido, sti cavoli: il peggio andrà a lui/lei (non è questa la sede per spiegare il perchè di ciò) ].

    In ogni caso, per evitare che la storia si dilunghi più del dovuto, credo che lascerò il tutto così. Se magari capiterà in futuro un caso di utente con nome accentato, potrò sempre far apparire una modale con jQueri avvisandolo di mettere tranquillamente il suo nome senza lettere accentate.

    ..per il sito che sto costruendo non è cruciale una lettera accentata.

    Comunque il link consigliato è ottimo!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.