Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Aiuto espressione regolare

    Salve a tutti. Mi servirebbe un piccolo aiuto con le espressioni regolari: in pratica dovrei filtrare dei parametri che abbiano come chiave un testo in questo formato: "3_16:54-18:30_teacher2planning_FK_teacher2module_id".

    Non mi interessa cosa c'è dopo teacher2planning_, quindi ho formulato questa espressione ma non si comporta come dovrebbe:

    <?php
    preg_match('/^[0-9\?]+_[0-9\?]{2}:[0-9\?]{2}-[0-9\?]{2}:[0-9\?]{2}_teacher2planning_[a-z0-9_\?]+/', $key) != false
    ?>

    Qualche aiuto?

  2. #2
    Così potrebbe funzionare:

    Codice PHP:
    $rule "/^[0-9]+_[0-9]{2}:[0-9]{2}-[0-9]{2}:[0-9]{2}_teacher2planning_[A-Za-z0-9_]+$/"
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Originariamente inviato da satifal
    Così potrebbe funzionare:

    Codice PHP:
    $rule "/^[0-9]+_[0-9]{2}:[0-9]{2}-[0-9]{2}:[0-9]{2}_teacher2planning_[A-Za-z0-9_]+$/"
    Grazie mille funziona.

  4. #4
    Se non ti interessa cosa c'è dopo un certo punto della stringa potresti anche provvedere ad allegerire il lavoro della preg_match andando a togliere da subito tutto ciò che segue "teacher2planning_".

    In questo modo la tua espressione regolare si limita a studiare solo ed esclusivamente cosa a te interessa.

  5. #5
    Originariamente inviato da Portabile84
    Se non ti interessa cosa c'è dopo un certo punto della stringa potresti anche provvedere ad allegerire il lavoro della preg_match andando a togliere da subito tutto ciò che segue "teacher2planning_".

    In questo modo la tua espressione regolare si limita a studiare solo ed esclusivamente cosa a te interessa.
    Quindi ti riferisci a una cosa del genere:


    $rule = "/^[0-9]+_[0-9]{2}:[0-9]{2}-[0-9]{2}:[0-9]{2}_teacher2planning_$/";

    Ma con il dollaro finale o non?

  6. #6
    Utente di HTML.it L'avatar di Takeno
    Registrato dal
    May 2007
    Messaggi
    146
    Senza $ finale.

    Il simbolo del dollaro in un'espressione regolare sta a significare la fine della stringa.

    teacher2planning_$/
    vorrebbe dire che dopo "teacher2planning_" non ci deve essere più nulla.

  7. #7
    Codice PHP:
    //formato key
    //$key = "3_16:54-18:30_teacher2planning_FK_teacher2module_id";
    //echo "Key prima della troncatura". $key ."
    ";

    //elimino tutto ciò che c'è dopo _teacher2planning_ e compreso _teache2planning_
    $key = str_replace(substr($key, stripos($key, "_teacher2planning_")), "", $key);

    // debug
    //echo 
    $key;

    $rule = "/^[0-9]+_[0-9]{2}:[0-9]{2}-[0-9]{2}:[0-9]{2}$/";
    if(preg_match(
    $rule$key)) echo "true"; 
    se lo script si limitasse ad eseguire questo controllo quello che ti ho consigliato non cambierebbe molto per le risorse richieste dal tuo script ma immagino che prima e dopo vi siano altre richieste di elaborazione dati.

    preg_match è molto potente come funzione però è anche una delle tante del set dannattamente pesanti per il sistema. Prima ci abituiamo ad allegerire il software meglio è

  8. #8
    Originariamente inviato da Portabile84
    Codice PHP:
    //formato key
    //$key = "3_16:54-18:30_teacher2planning_FK_teacher2module_id";
    //echo "Key prima della troncatura". $key ."
    ";

    //elimino tutto ciò che c'è dopo _teacher2planning_ e compreso _teache2planning_
    $key = str_replace(substr($key, stripos($key, "_teacher2planning_")), "", $key);

    // debug
    //echo 
    $key;

    $rule = "/^[0-9]+_[0-9]{2}:[0-9]{2}-[0-9]{2}:[0-9]{2}$/";
    if(preg_match(
    $rule$key)) echo "true"; 
    se lo script si limitasse ad eseguire questo controllo quello che ti ho consigliato non cambierebbe molto per le risorse richieste dal tuo script ma immagino che prima e dopo vi siano altre richieste di elaborazione dati.

    preg_match è molto potente come funzione però è anche una delle tante del set dannattamente pesanti per il sistema. Prima ci abituiamo ad allegerire il software meglio è
    Ma no, cosi' facendo usi la bellezza di 4 funzioni (stripos, substr, str_replace, preg_match) facendo fare allo script molto piu' lavoro di un semplice preg_match (che usi comunque, e l'accorciamento del pattern non fa assolutamente differenze percettibili, probabilmente neanche con dei benchmark).

    preg_match ed altre funzioni della stessa famiglia non sono affatto "dannatamente pesanti". Una str_replace e' piu' veloce di una preg_replace nel caso si lavori con testo letterale senza wildcard, ma e' una differenza che si puo' notare solo con benchmark precisi e su iterazioni di tante sostituzioni (dove per tante intendo nell'ordine di centinaia di migliaia). Per una ricerca o una sostituzione non c'e' all'atto pratico nessuna differenza.

  9. #9
    Si infatti volevo dire anche io che per quel che serve all'utente sicuramente andrà più che bene anche la sua senza troncature e non si noterà differenza.

    Per quanto riguarda invece i casi molto complessi, cercando di immaginare, mi viene da pensare che:

    str_replace, substr ed str(i)pos hanno tutte complessità lineare (se non ricordo male... ci sta anche che ricordi male io).

    preg_replace ha una complessità ben maggiore e sicuramente non lineare e quindi anche tempi di esecuzione ne risentono.

    Ora ammettiamo ci siano un set di 1.000.000 di verifiche da effettuare (giusto per parlare di molti anche se sono relativamente molti):

    utilizzando il soggetto indicato dall'utente per ogni controllo ci metto più o meno 21 secondi a farle (poi varia anche dalle potenzialità del calcolatore - io ho provato su un catorcio di server).

    se provo a modificare inserendo la modifica che ho scritto, ottengo la verifica del blocco di 1M in 13 secondi.

    Una bella differenza no? E se proviamo ad aumentare ancora??
    Vero è che il software per fare milioni di controlli deve essere qualcosa di grosso.
    Però è giusto per dire... se ci si abitua da subito a tenere certi accorgimenti...

  10. #10
    Ho fatto un test simile con risultati molto diversi. Aggiungendo la pre-manipolazione della stringa, il tempo di esecuzione e' piu' che triplicato. Non e' che hai messo le tue funzioni fuori dal ciclo da un milione di iterazioni tenendo dentro solo preg_match?

    Codice PHP:
    $str '3_16:54-18:30_teacher2planning_FK_teacher2module_id';

    for ( 
    $x 0$x 1000000$x++ ) {
        
    $str2 str_replace(substr($strstripos($str"_teacher2planning_")), ""$str);
        
    preg_match("/^[0-9]+_[0-9]{2}:[0-9]{2}-[0-9]{2}:[0-9]{2}_teacher2planning/"$str2);
    }

    // $ time php foo.php 
    // real    0m16.638s
    // user    0m11.737s
    // sys     0m4.800s 
    Codice PHP:
    $str '3_16:54-18:30_teacher2planning_FK_teacher2module_id';

    for ( 
    $x 0$x 1000000$x++ ) {
        
    preg_match("/^[0-9]+_[0-9]{2}:[0-9]{2}-[0-9]{2}:[0-9]{2}_teacher2planning/"$str);
    }

    // $ time php foo.php 
    // real    0m5.229s
    // user    0m4.008s
    // sys     0m1.188s 

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.