Visualizzazione dei risultati da 1 a 6 su 6

Discussione: difficoltà regExp

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    46

    difficoltà regExp

    Ciao a tutti.
    Sto diventando matto perchè probabilmente non sto usando nel modo giusto le regular expression.

    Ho una stringa fatta in questo modo:

    "abc-abc-abc-"

    dove identifichiamo

    'abc-' col nome di gruppo
    'abc' col nome di info
    '-' col nome di divisore

    1) possono esserci n gruppi ("abc-abc-abc-abc-abc-"
    2) info ha lunghezza variabile ('a' oppure 'aa' oppure 'abccabc') ma sempre formato da 'a' 'b' 'c'
    2) il divisore può essere differente per ogni gruppo e più lungo di un carattere ma mai composto da 'a' 'b' 'c' (abc.abc:::abc//)

    Il mio compito è mettore tutti i divisori in un array, quindi:

    abc.abc:::abc// ==> array('.',':::','//')

    La mia domanda è, posso farlo con preg match e una singola regexp??

    per ora sono arrivato a questo:

    codice:
    $str = "abc/abc-abc:";
    $reg = "/[abc]+([^abc]+)/";
    preg_match($reg, $str, $result);
    dove $result è:

    codice:
    array("abc/", "/")
    in pratica riesco a prendere il primo divisore. Così ho pensato di aggiungere alla regexp la ricerca della precedente condizione n volte (+):

    codice:
    $reg = "/([abc]+([^abc]+))+/";
    ma il risultato è:

    codice:
    array("abc/abc-abc:", "abc:", ":")
    ovvero prende solo l'ultimo valore. Pensavo che preg_match riportasse tutti i match e non solo l'ultimo incontrato. Dove sbaglio? E' possibile fargli ritornare tutti i divisori.

    Un'ulteriore prova che ho fatto è stata modificare la stringa di ingresso così:

    "abc/abc-abc"

    ed ancora mi da solo l'ultimo divisore (-)...

    qualcuno sa spiegarmi?

    potrei risolverlo con un ciclo eliminando tutte le volte il gruppo iniziale o finale, ma a sto punto lo farei senza regexp...

    Ringrazio in anticipo per eventuali spiegazioni, vorrei chiarirmi una volta per tutte il concetto di matching

    Ciao
    Yuri

  2. #2
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    usando un èò di fantasia ho trovato questa soluzione:
    codice:
    // stringa iniziale
    $stringa = "abc/abc-abc:";
    // carattere usato come separatore (666 corrisponde a š)
    $split_char = chr(666);
    // sostituisco tutte le lettere con il carattere usato come separatore
    $stringa = preg_replace( "/([a-zA-Z]+)/", $split_char, $stringa );
    // esplodo la stringa per avere i divisori
    $divisori = explode( $split_char, $stringa );
    print_r( $divisori );

    think simple think ringo

  3. #3
    Utente di HTML.it L'avatar di xPilux
    Registrato dal
    Jul 2004
    Messaggi
    103
    ...hai provato ad usare 'preg_match_all' al posto di 'preg_match'??

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    46
    provato anche con preg_match_all()

    Il metodo di marketto può andare bene modificando la regexp per sostituire solo le lettere 'abc':

    codice:
    /([abc]+)/
    Grazie 1000 per l'aiuto... mi piace quando si stravolge un approccio... l'hai preso proprio al contrario... grande!

    Però non capisco perchè non posso farlo con un'unica regexp... Con che criterio preg_match cattura le stringhe che matcha?

    ciao
    Yuri

  5. #5
    Utente di HTML.it L'avatar di xPilux
    Registrato dal
    Jul 2004
    Messaggi
    103
    ....forse nn ho capito bene il quesito....ma facendo in questo modo, selezioni tutti i divisori:
    Codice PHP:
    <?
    $str 
    "accbc/abbbc-abaac:abc?";
    $reg "/[abc]+([^abc]+)/";
    preg_match_all($reg$str$result);

    foreach(
    $result[1] as $x)
    {
        echo 
    $x '
    '
    ;
    }
    ?>

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    46
    avevo provato con:
    $reg = "/([abc]+([^abc]+))+/";

    ma non con la prima...
    mi ero fissato... mannaggia!

    mi spieghi perchè così non va?

    grazie 1000 comunque

    ciao
    Yuri

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.