Visualizzazione risultati 1 fino 9 di 9

Discussione: [PHP] Espressioni regolari... dubbi tecnici...

  1. #1
    Guest

    Predefinito [PHP] Espressioni regolari... dubbi tecnici...

    Salve a tutti!

    Il nocciolo e' questo:
    devo analizzare un input per verificare se si tratta di addizioni/sottrazioni con numeri naturali.

    Per definire un numero naturale ho impostato come espressione regolare:
    [1-9]\d*

    Da questo si passa a due domande:

    per evitare di riscrivere sempre la stessa regexp ho definito una costante del tipo:
    Codice PHP:
    define("P_NUM", "[1-9]\d*");
    che poi ho utilizzato all'interno di una preg_match in qst modo:
    Codice PHP:
    preg_match("/^".P_NUM."$/", $var)
    E' la soluzione migliore o esistono altre soluzioni piu' "professionali / eleganti / efficienti"?

    Infine:
    volendo riconoscere addizioni e sottrazioni con numeri naturali la sola regola
    P_NUM."[+\-]".P_NUM
    non basterebbe... esiste un modo per riconoscere come espressione corretta una sottrazione solo nel caso il secondo P_NUM fosse <= del primo?

    Un grazie a tutti, aspetto trepidante...

    Ciao!

    P.S.
    Un ultimo chiarimento: come vedete utilizzo le regexp stile perl di php (c sono + affezionato ) rispetto a quelle posix... secondo voi faccio bene o e' preferibile utilizzare qste ultime... e perche'? (Maggior compatibilita' o potenza?)
    Grazie ancora, ciao!
    Ultima modifica di sanpioxct : 17-05-2006 alle ore 21.58.53

  2. #2
    Guest

    Predefinito

    Per il problema principale, secondo me fai prima ad usare:
    if($n>0 && $n<300)

    Le reg di classe perl sono spesso più veloci e più performanti delle posix, come descritto nel manuale.


    Ciaooo!!!!

  3. #3
    Guest

    Talking

    Citazione Originalmente inviato da debug
    Per il problema principale, secondo me fai prima ad usare:
    if($n>0 && $n<300)
    Ooops... ho modificato il mio post facendo scomparire quello a cui ti riferivi debug (anche perche' alla fine mi ero risposto da solo e volevo evitare figure cosi' barbine in pubblico... ) ma mentre lo facevo tu non stavi con le mani in mano, eh?

    Citazione Originalmente inviato da debug
    Le reg di classe perl sono spesso più veloci e più performanti delle posix, come descritto nel manuale.
    Quindi l'efficienza non e' in discussione, good! E mi sai dire nulla riguardo a compatibilita' e/o "potenzialita'" (> , < o = rispetto a qlle perl)?

    Citazione Originalmente inviato da debug
    Ciaooo!!!!
    Ciaoooo!!!
    Ultima modifica di sanpioxct : 17-05-2006 alle ore 21.59.50

  4. #4
    Guest

    Predefinito

    Per la compatibilità non c'è problema, sono riconosciute dalla versione 3 di php. Le preg sono abilitate di default, invece le posix sono built-in.
    Potenzialità... ho detto tutto prima, sono più veloci e performanti, questo io intendo per potenzialità ;)


    Ciaoooooo!!!!!!

  5. #5
    Guest

    Red face

    Citazione Originalmente inviato da debug
    Potenzialità... ho detto tutto prima, sono più veloci e performanti, questo io intendo per potenzialità ;)
    Si', e' sicuramente importante (e gia' basterebbe qst per preferirle in termini di efficienza! ) ma qllo che intendevo io per "potenzialita'" e' la possibilita' di riconoscere espressioni piu' complesse in maniera piu' semplice (magari grazie a particolari pattern/meta-caratteri i cui equivalenti non sono presenti in quelle perl)... ti risulta?
    Lo so sono molto curioso...

    Ciao.
    Ultima modifica di sanpioxct : 17-05-2006 alle ore 22.27.50

  6. #6
    Guest

    Predefinito

    AH! Scusa non avevo inteso il senso!
    Effettivamente, proprio grazie ai pattern modificatori ma non solo a questi, le perl compatibili se la cavano meglio in situazioni più particolari o complesse.

    PS: la curiosità è una virtù! ;)


    Ciaooo!!!!!

  7. #7
    Guest

    Wink

    Ciao debug.
    Citazione Originalmente inviato da debug
    PS: la curiosità è una virtù! ;)
    Altroche' se unita alla ponderatezza pero' e' meglio!
    Cmq, scusa, e' vero che sono curioso, ma a volte purtroppo anche un po' pigro...
    Mi sono appena fatto un giretto su php.net e...
    Suggerimento: Il PHP, utilizzando le funzioni PCRE, supporta anche le espressioni regolari con una sintassi compatibile con Perl. Queste funzioni supportano riconoscimenti "pigliatutto", asserzioni, criteri condizionali, e diverse altre caratteristiche che non sono supportate dalla sintassi POSIX estesa.
    Ok quindi riguardo a qst piccolo chiarimento ho avuto tutte le risposte che mi servivano... (e sono contento della mia scelta)

    Spero qualcuno soddisfera' anche gli altri miei dubbi...

    Ciao!
    Ultima modifica di sanpioxct : 17-05-2006 alle ore 22.33.08

  8. #8
    Guest

    Predefinito

    beh, per quanto riguarda il verificare che il primo termine sia maggiore del secondo penso che un semplicecontrollo (if) possa essere sufficiente, ricordo che la funzione preg_match ha 3 argomenti, l'ultimo dei quali racchiude appunto i risultati trovati, quindi la funzione utilizzata in questo modo:
    Codice PHP:
    $str = "23-32";
    $res = "termini non validi!";
    $check = preg_match ("@([0-9]+)-([0-9]+)@", $str, $matches);
    if (
    $check && isset($matches[1], $matches[2])) {
    if (
    $matches[2] <= $matches[1]) {
    $res = $matches[1] - $matches[2];
    }
    }
    print
    $res;
    penso potrebbe andare (ricordo anche che preg_math assegna all'indice 0 dell'arry dei risultati la parte di testo completa, dunque in questo caso 23-32, mentre ad indici successivi assegna le varie parti racchiuse tra parentesi tonde).

    E' molto probabile (come sempre^^) che nel mio script vi siano errori, ma è giusto x rendere l'idea..

    EDIT :: dimenticavo, come mai non consideri anche lo zero..?
    Ultima modifica di koraz : 18-05-2006 alle ore 00.02.24

  9. #9
    Guest

    Predefinito

    @koraz: Grazie, controllero' qnt prima, per ora sono di corsa, come sempre...

    Citazione Originalmente inviato da koraz
    EDIT :: dimenticavo, come mai non consideri anche lo zero..?
    voglio che i numeri non abbiano 0 in testa... il primo carattere deve essere una cifra decimale 1...9 dal secondo in poi qualunque cifra decimale (quel \d serve proprio a qsto) o nulla

    Ciao!

    EDIT:
    @koraz: si', avevo pensato anch'io che una soluzione possibile sarebbe stata controllare la sola sintassi (le regole a cui deve sottostare perche' la forma corretta) dell'input mediante regexp e, successivamente, analizzarne la semantica (es. che, trattandosi di numeri naturali, in una sottrazione il primo num deve essere > del secondo) spezzando l'input in varie sottostringhe...
    Se e' l'unica soluzione dovro' risolvere cosi'...
    Ma se a qualcuno risulta che sempre e direttamente mediante regexp e possibile effettuare controlli anche sulla "semantica" (diciamo cosi') dell'input... x favore me lo faccia sapere!!!

    Ciao!

    EDIT:
    Piu' leggo e piu' mi convinco che probabilmente non e' possibile controllare la "semantica" direttamente con le regexp...

    EDIT:
    Ok, mi sono documentato a sufficienza credo, e penso proprio che il tipo di analisi/controllo che intendo fare io sull'input debba essere effettuato "a manina"...
    Be', lasciando da parte il discorso "semantica", qualche animo gentile mi puo' dire cosa pensa in merito al mio primo dubbio? Plz!
    Ultima modifica di sanpioxct : 25-05-2006 alle ore 16.04.00

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •