Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Espressione regolare

  1. #1

    Espressione regolare

    Salve a tutti,
    Vorrei sapere come estrarre tramite espressione regolare ed un ciclo il 999 ed il 666 contenuti in una stringa come questa:

    -999(20|14/10/2005+03:55|)--666(24|16/12/2002+13:12|)-

    Grazie a tutti!
    What is the |\/|atrix?

  2. #2
    Forse mi sono spiegato un pò male...
    Io ho già un esempio di espressione regolare che nella stringa mi estrae però il 20 ed il 24 conoscendo rispettivamnte il 999 ed il 666 e cioè:

    $stringa = "-999(20|14/10/2005+03:55|)--666(24|16/12/2002+13:12|)-";
    $id="999";
    if(preg_match_all('#'.$id.'\((.+?)\)#si', $stringa, $results)) {
    echo substr(implode("", $results[1]), 0, -18)."
    ";
    }

    Ora invece avrei bisogno di conoscere in poche parole tutto quello che c'è tra il trattino - e l'apertura di parentesi (

    Spero di essermi spiegato...
    Grazie a tutti.
    What is the |\/|atrix?

  3. #3
    codice:
    preg_match_all("/-(\d+)\(.*?\)-/",$stringa,$results);
    foreach($results[1] AS $value) echo $value."
    ";
    prova così
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  4. #4
    L'espressione funziona alla perfezione, Grazie!
    Ho anche un problemuccio con la mia espressione...

    Ipotizzando che ho un campo così formato:
    -2(50|17/10/2005+17:18|)--1(70|17/10/2005+17:17|)-
    ed una query così composta:
    codice:
    $id=2;
    $query = mysql_query("SELECT id,nome,campo FROM $db_table where campo LIKE '%-$id(%)-%'");
    while($voce = mysql_fetch_array($query)) {
    $nome=$voce['nome'];
    $testo=$voce['campo'];
    if(preg_match_all('#'.$id.'\((.+?)\)#si', $testo, $results)) {
    echo $nome." - ".substr(implode("xxxxxxxxxxxxx", $results[1]), 0, -18)."
    ";
    }
    }
    il risultato è:
    nome2 - 50

    Ma nel caso il campo fosse:
    -2(50|17/10/2005+17:18|)--2(50|17/10/2005+17:17|)-

    Mi si impalla la preg e non mi risponde per come dovrebbe cioè:
    nome2 - 50
    nome2 - 70

    Perchè?
    Mi date una mano?
    Grazie ancora.
    What is the |\/|atrix?

  5. #5
    non ho ben capito cosa devi fare, ma cmq se a \) sostituisci \| ti viene restituito direttamente il numero senza dover usare substr(). Poi riimplementi il resto...
    codice:
    if(preg_match_all('#'.$id.'\((.+?)\|#', $testo, $results))
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  6. #6
    Grazie ancora,
    ma il mio problema è un'altro...
    Ti posto il codice esattamente per come è.
    Avendo nella $db_table1 2 campi (id e nome):
    1 | utente1
    2 | utente2
    3 | utente3

    e nella $db_table2 3 campi (id,nome,campo)

    1 | ProdottoA | -2(50|17/10/2005+17:18|)--1(50|17/10/2005+17:17|)-
    2 | ProdottoB | -2(50|17/10/2005+17:38|)--3(50|17/10/2005+17:30|)-

    facendo:
    codice:
    $query_u = mysql_query("SELECT * FROM $db_table1 order by cognome");
    while($u = mysql_fetch_array($query_u)) {
    $id=$u['id'];
    $query_pu = mysql_query("SELECT id,nome,campo FROM $db_table where campo LIKE '%-$id(%)-%'");
    while($voce = mysql_fetch_array($query_pu)) {
    $testo=$voce['campo'];
    if(preg_match_all('#'.$id.'\((.+?)\)#si', $testo, $results)) {
    echo "$id - ".$u['nome']." - ".$voce['id']." - ".$voce['nome']." - ".substr(implode("xxxxxxxxxxxxx", $results[1]), 0, -18).",00";
    }
    }
    }
    Il risultato è:

    1 - utente1 - 1 - Prodotto A - 50
    3 - utente3 - 2 - Prodotto B - 50
    2 - utente2 - 1 - Prodotto A - 50
    2 - utente2 - 2 - Prodotto B - 50

    è cosi funziona per come dovrebbe!
    Il problema è che quando la $db_table2 è così:

    1 | ProdottoA | -2(50|17/10/2005+17:18|)--2(50|17/10/2005+17:17|)-
    2 | ProdottoB | -2(50|17/10/2005+17:38|)--2(50|17/10/2005+17:30|)-

    il sistema si impalla è mi risponde così:

    2 - utente2 - 1 - Prodotto A - 50|17/10/2005+17:18|xxxxxxxxxxxxx50
    2 - utente2 - 2 - Prodotto B - 50|17/10/2005+17:38|xxxxxxxxxxxxx50

    invece che rispondermi così:

    2 - utente2 - 1 - Prodotto A - 50
    2 - utente2 - 2 - Prodotto B - 50

    Come risolvo?
    What is the |\/|atrix?

  7. #7
    il punto è che fai un implode dentro un substr. I valori inseriti in substr sono statici, quindi non si può adattare al caso di 2+ prodotti associati allo stesso utente.
    Cmq prova così e dimmi se va bene.
    codice:
    if(preg_match_all('#'.$id.'\((.+?)\|#', $testo, $results)) {
    foreach($results[1] AS $price)
    echo "$id - ".$u['nome']." - ".$voce['id']." - ".$voce['nome']." - ".$price.",00"."
    ";
    Ma invece ... strutturare il dB in maniera più civile?
    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
    Non so come ringraziarti..
    Ha funzionato!
    Sapresti indicarmi qualche valido link per comiciare ad imparare le espressioni regolari?
    Sto scoprendo giorno dopo giorno che sono sempre di più la mia bestia nera!!! :maLOL:
    Grazie ancora
    What is the |\/|atrix?

  9. #9
    Link non saprei. Io ho sempre usato come riferimento www.php.net, ma forse è un po' criptico. Ieri mi sono iscritto ad un forum dedicato (http://regexadvice.com/ : indicato da altri utenti qui sul forum di html), puoi provare a guardare lì, ma non so come sia, devo ancora darci un'occhiata.
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  10. #10
    Va bene... Grazie lo stesso! Darò uno sguardo al link che mi hai suggerito..
    What is the |\/|atrix?

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.