Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    762

    [ preg_match() ] Problema su matching di ritorno a capo. Help

    Buongiorno a tutti,

    ho un problema col matching del carattere di ritorno a capo.

    Questa la situazione: ho una textarea nella quale vorrei bloccare l'inserimento di determinati caratteri quali $ ? ( ) % = # < > / & * .

    Obiettivo: bloccare l'inserimento dei suddetti caratteri CON o SENZA ritorni a capo nella textarea.
    ----------------

    Questa è la regEx utilizzata:

    Codice PHP:
    preg_match ("/($|\?|\(|\)|%|=|#|<|>|\/|&|\*)+/"$testo
    Risultato: digitando uno dei caratteri sopra regExxati, ottengo il (voluto) messaggio di errore.

    Risultato non voluto: se nella textarea premo invio (quindi vado a capo) e digito uno dei regExxati caratteri...NON ottengo il messaggio di errore.

    ........
    .........
    ..........allora ho provato così:

    Codice PHP:
    preg_match ("/($|\?|\(|\)|%|=|#|<|>|\/|&|\*|\r\n|\r|\n)+/"$testo
    Risultato: idem come sopra.
    Risultato non voluto: IDEM COME SOPRA!


    ...dov'è che sbaglio? dov'è che ometto? dov'è che sintasseggio malamente?


    Grazie a tutti.

  2. #2
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    hai fatto gli escape corretti? la tua stringa dovrebbe essere piu' o meno cosi:

    "/(\\$|?|\(|\)|%|=|#|<|>|\/|&|\*|\r\n|\r|\n)+/"

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    762
    Si si.

    Stando alla biblica guida che mi è stata suggerita post-addietro [ http://www.regular-expressions.info/ ], gli escape sono corretti..e dove non li vedi..non sono necessari.


    Ad ogni modo, ho risolto il problema con un escamotage "a monte".

    Eccolo.
    Codice PHP:
    if (isset($_POST['invio'])) { # All'invio dei dati..

      /* ..sostituisco dal principio i carriage return e i line feed con un semplice spazio.
       * In questo modo, la textarea diventerà un'area di testo "mono-stringa", cioè senza
       * alcun ritorno a capo. Così, la preg_match di controllo potrà svolgere il suo lavoro 
       * senza il rischio di non incontrare i caratteri speciali posti sotto i CRLF.
      */
      
    $testo preg_replace('/(\r\n|\r|\n)+/'' '$_POST['testo']);  # CRLF in varie soluzioni

        
    if (preg_match("/($|?|(|)|%|=|#|<|>|/|&|*)+/"$testo)) {

          echo 
    "Altolà! Ndo vai se il carattere speciale (e altri) tu hai??";
          exit();
        }


    Così facendo, i ritorni a capo nella textarea verranno convertiti e testando l'errore con var_dump ne risulterà un carattere di spazio normale.


    Questo problema mi ha bloccato per una settimana nonstante abbia letto guide su guide, articoli su articoli.

    Propongo questo thread come soluzione per coloro che come me si sono trovati in questa situazione.

    Buon proseguimento a tutti.

  4. #4
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    ma non ha mica senso
    la libreria pcre normalmente interpreta la stringa in input trattando gli "a capo" come normali caratteri, a meno che nella regexp non ci siano i ^$ e non venga specificato il modifier m

    quindi nel tuo caso, doveva sbattersene degli \r\n e matchare comunque

    basta fare un piccolo test per convincersi:

    var_dump(preg_match ("/(\\$|\?|\(|\)|%|=|#|<|>|\/|&|\*)+/", "\r\n%"));

    la riga di sopra restituisce 1, quindi matcha il % nonostante ci siano degli \r\n prima

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    762
    Boh. A me non faceva risultare i CRLF nè se inseriti tra parentesi, nè in nessun'altra soluzione. Testando su vari browser non usciva nulla. Come se niente fosse.



    Ad ogni modo, con questa soluzione ho risolto il mio problema e potrebbe risolverlo ad altri


    PS: perchè ESCAPI il simbolo del dollaro due volte?

  6. #6
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Originariamente inviato da wartpro
    PS: perchè ESCAPI il simbolo del dollaro due volte?
    perche' nelle stringhe delimitate dai double quote "" il parser di php interpreta alcuni caratteri speciali ed espande le variabili.
    come ben sai, le variabili in php sono precedute dal dollaro seguito dal nome della variabile
    quindi in una stringa tipo "ciao $mondo" il parser cerchera' di interpretare $mondo come variabile
    per farlo interpretare come stringa bisogna escappare il dollaro: "ciao \$mondo"

    andando avanti, in una regex definita tra le double quotes tipo
    "/ciao \$mondo/"
    l'escape del \$ verra' gia' tolto dal parser prima di andare alla pcre, quindi alla pcre arrivera' il $ nudo, che lo interpretera' a modo suo, cioe' come meta-carattere di fine stringa
    quindi bisogna escapparlo una seconda volta, "/ciao \\$mondo/", ed in questo modo sia il php che il pcre lo interpreteranno come carattere dollaro senza altri significati.

    in alternativa basta definire la regex con apici singoli:
    '/ciao \$mondo/'

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    762
    Non lo sapevo

    Grazie per la dritta!

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 © 2024 vBulletin Solutions, Inc. All rights reserved.