Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Regular Expression

  1. #1

    Regular Expression

    Un piccolo aiuto perché non ne vengo fuori.

    Ho questo codice

    Codice PHP:
    $stringa=<<<stringa

        bla bla

    bla2 bla2
    <!--Inizio commento pippo->
        bla3 bla3

    stringa;

    if(
    preg_match_all('/<\\!\\-\\-Inizio commento (.*)\\-\\-\\>(.*)\\<\\!\\-\\-Fine commento \\1\\-\\-\\>/s',$stringa,$matches)) {
        die(
    print_r($matches));

    questa regexp non fa "esattamente" quello che voglio fare. Io vorrei avere due risultati, una per ogni blocco inizio/fine. Invece ne considera giustamente uno solo: quello compreso tra il primo "inizio" e l'ultimo "fine".

    Come dovrei fare?

    Ringrazio in anticipo =)

  2. #2
    Utente di HTML.it L'avatar di brodik
    Registrato dal
    Jan 2009
    Messaggi
    764
    prova con:
    Codice PHP:
    if(preg_match_all("#.*?/s#"$stringa$matches)) { 

  3. #3
    Ciao
    nel'espressione regolare devi sostituire
    codice:
    Inizio commento (.*)
    con
    codice:
    Inizio commento ([^>]*)
    escludendo il carattere di chiusura del "tag".

    La stringa che stai testando è errata, il secondo "tag" di inizio commento è chiuso con -> invece che con -->

    Codice PHP:
    preg_match_all('/<\\!\\-\\-Inizio commento ([^>]*)\\-\\-\\>(.*?)\\<\\!\\-\\-Fine commento \\1\\-\\-\\>/s',$stringa,$matches

    Alessandro
    Full Stack Developer presso Advice Lab
    Bonus Bitcoin
    Moon Bitcoin

  4. #4
    Grazie Brodik,
    Questa regexp fa esattamente ciò che voglio
    Codice PHP:
    if(preg_match_all("/\\<\\!\\-\\-Inizio commento ([a-zA-Z0-9]*)\\-\\-\\>(.*?)\\<\\!\\-\\-Fine commento [a-zA-Z0-9]*\\-\\-\\>/s"$stringa$matches)) { 
    Il piccolo problema è che mi sfugge il perché =)
    Cos'è quel "?" che mi risolve tutto?
    e perché se metto \1 al fine commento (che dovrebbe matchare la prima parola trovata) non funziona più?

    Grazie infinite comunque =)

    PS: Grazie Magicale per la segnalazione dell'errore (che mi stava facendo diventar matto).

  5. #5
    correggo la regexp:

    Codice PHP:
    if(preg_match_all('/\\<\\!\\-\\-Inizio commento ([a-zA-Z0-9]*)\\-\\-\\>(.*?)\\<\\!\\-\\-Fine commento \\1\\-\\-\\>/s'$stringa$matches)) { 
    mettendo gli apici singoli invece che doppi anche con lo \1 funziona.

    in pratica bastava quel "?" in mezzo... come mai? cosa fa?

  6. #6
    Il ? rende facoltativo il carattere che lo precede e non è quello a risolvere il tuo problema.
    La suluzione è nella parte precedente in cui hai sostituito
    Inizio commento (.*)
    con
    Inizio commento ([a-zA-Z0-9]*)

    In questo modo i caratteri che di chiusura del "tag", ovvero --> , sono esclusi e viene risolto l'errore per cui prelevava tutto ciò che era compreso tra il primo "inizio" e l'ultimo "fine".
    Full Stack Developer presso Advice Lab
    Bonus Bitcoin
    Moon Bitcoin

  7. #7
    mmh no...
    se fai la prova (nel frattempo l'ho complicato un po')

    Codice PHP:
    <?php
    $stringa
    =<<<stringa

        bla bla

    bla2 bla2


    cip ciop



        bla3 bla3
        <pluto>xoh</pluto>

    stringa;
    if(
    preg_match_all('/\\<\\!\\-\\-Inizio commento ([a-zA-Z0-9]*)\\-\\-\\>(.*?)\\<\\!\\-\\-Fine commento \\1\\-\\-\\>/s'$stringa$matches)) {
        die(
    print_r($matches));
    }
    ?>
    questo funziona.
    Se provi semplicemente a togliere il ? non funziona più
    (il [^>] come il [a-z] già l'avevo provato ma non funzionava)

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    .*? questo costrutto trova l'occorrenza più vicina
    .* questo no.

    ad esempio


    se tu hai "AbbbAcccAdddAeee"
    se usi "(A.*A)" il match è "AbbbAcccAdddA"
    se usi "(A.*?A)" il match è "AbbbA"

  9. #9
    Originariamente inviato da andreamk
    .*? questo costrutto trova l'occorrenza più vicina
    .* questo no.
    Questa informazione mi avrebbe risolto tante di quelle cose... ma tante...
    Quindi è proprio una sintassi sua .*?
    e non c'è una qualche conseguenza strana a una regola generale (infatti ciò che diceva Magicale lo sapevo, ma lo stesso non riuscivo a spiegarmelo)

    grazie mille ragazzi

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 © 2024 vBulletin Solutions, Inc. All rights reserved.