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

    E' corretta questa regexp?

    Ciao a tutti.
    Abbiamo scritto una regexp per il riconoscimento di una parola:
    Codice PHP:

    $regexp 
    "[[:space:][:punct:]]*$parola[[:space:][:punct:]]*";

    //va inserita in una query SQL tipo:
    SELECT FROM nometabella WHERE campo REGEXP $regexp 
    Dovrebbe riconoscere una parola che:
    -può essere all'inizio, alla fine o nel mezzo di un record
    -può essere preceduta o seguita da uno o più spazi o segni di interpunzione
    -può essere seguita o preceduta da caratteri speciali (@#^ ecc)
    -può essere seguita o preceduta da numeri
    -non può essere seguita o preceduta da caratteri alfabetici.

    Voi che ne dite? Come posso migliorarla?
    Grazie

  2. #2
    Utente bannato
    Registrato dal
    Sep 2005
    Messaggi
    905
    si però credo che si possa migliorare (non so come )
    vai qui:

    http://forum.html.it/forum/showthrea...hreadid=392715


  3. #3
    Sembra e dico sembra che ce l'ho fatta.

    Allora una regexp che fa quel che voglio l'ho trovata, ma c'è qualcosa di strano nel preg_replace:
    Codice PHP:
    $stringa "ciao questa è una parola; seguita dai due punti";
    $parola "parola";
    $regex "/[^A-Za-z0-9]".$parola."[^A-Za-z0-9]/i";
    $substitution "[b] ".$parola." [/b]";
    preg_replace($regex$substitution$stringa);
    //il risultato è
    //ciao questa è una[b]parola[/b]seguida dai due punti 
    Ora, come vedete prima di "parola" il grep (si chiama così?) ha intercettato uno spazio, e dopo "parola" ha intercettato un punto e virgola. Nella sostituzione però queste cose le ha eliminate.

    Io vorrei che il risultato finale fosse:
    codice:
    Ciao questa è una parola; seguida dai due punti
    Ovvero che mi mantenesse ciò che trova (uno spazio e un punto-e-virgola) con [^A-Za-z0-9], senza sostituirlo. Credo di dover cambiare qualcosa in $substitution, ma cosa?

    Spero di essermi spiegato... e spero ci sia chi mi aiuta

  4. #4
    come l'hai modificata non soddisfa questo punto "-può essere seguita o preceduta da numeri" ...

    in questo caso se sostituisci [^a-zA-Z0-9] con \b risolvi il tuo problema.
    codice:
    $regex = "/\b".$parola."\b/i";
    Se invece vuoi usare una classe devi scrivere così :
    codice:
    $regex = "/(?<=[^A-Za-z0-9])".$parola."(?=[^A-Za-z0-9])/i";
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  5. #5
    Anakin, ti ringrazio per avermi indicato quel "\b", ma preferisco comunque usare [^A-Za-z] (ho tolto i numeri).

    Ok, la regex sembra funzionare bene nella query sql (tranne se cerco lettere singole: in quel caso trova dei risultati senza che ci sia corrispondenza: che sarà mai?)

    Rimane aperta l'altra domanda: come faccio a dire a preg_replace che deve rimpiazzarmi solo la parola, e non quello che le sta attorno? Questo un esempio tratto dalla mia ultima risposta:
    Codice PHP:
    $stringa "ciao questa è una parola; seguita dai due punti";
    $parola "parola";
    $regex "/[^A-Za-z0-9]".$parola."[^A-Za-z0-9]/i";
    $substitution "[b] ".$parola." [/b]";
    preg_replace($regex$substitution$stringa);
    //il risultato è
    //ciao questa è una[b]parola[/b]seguida dai due punti
    //ha eliminato lo SPAZIO prima di "parola" e i due punti dopo 
    vorrei un risultato così: "... è una parola; seguita da..."
    dove sbaglio?

  6. #6

    preg_replace risolto!!!

    A quanto pare ho risolto col preg_replace:
    Codice PHP:
    $substitution "[b]$0[/b]"



    Rimane aperta la questione:
    Ok, la regex sembra funzionare bene nella query sql (tranne se cerco lettere singole: in quel caso trova dei risultati senza che ci sia corrispondenza: che sarà mai?)

  7. #7
    A rigor di logica la tua regexp dovrebbe restituirti una cosa del genere:
    codice:
    $stringa = "ciao questa è una #parola; seguita dai due punti";
    // esegui il replace
    // e dovrebbe risultare = ciao questa è una#parola; seguita dai due punti
    Ma con la seconda regexp che ti ho postato hai provato?
    codice:
    $regex = "/(?<=[^a-z0-9])".$parola."(?=[^a-z0-9])/i";
    //puoi usare indifferentemente $parola o $0 nel replacement
    Per la regex nella query credo che il problema siano gli asterischi * che indicano 0 o piu occorrenze, quindi in pratica con una lettera sola becca quasi tutto se non tutto. Così a naso.
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  8. #8
    Ma con la seconda regexp che ti ho postato hai provato?
    codice:
    $regex = "/(?<=[^a-z0-9])".$parola."(?=[^a-z0-9])/i";
    //puoi usare indifferentemente $parola o $0 nel replacement
    si, ma mi dice che non è sql-valida...

    codice:
    //$parola = lista
    supplied argument is not a valid MySQL result resource
    SELECT * FROM tabella WHERE campo REGEXP '(?<=[^a-z0-9])lista(?=[^a-z0-9])'
    Per la regex nella query credo che il problema siano gli asterischi * che indicano 0 o piu occorrenze, quindi in pratica con una lettera sola becca quasi tutto se non tutto. Così a naso.
    Ma in quella che sto usando attualmente, NON ci sono asterischi!!!
    codice:
    $parola = "lista";
    '[^A-Za-z]lista[^A-Za-z]'

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.