Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88

    espressione regolare per prendere parole da una graffa

    Ho un testo in questo formato:

    "ciao car{{o}{a}} anonimo questo è un messaggio scritto da Pin{ {o} {a} } altro testo...non deve prendere {{o} txt {a}}"
    con l'espressione regolare
    .
    deve uscire fuori un array sequenziale
    output:
    [0] => 'o' 'a' cioè (preso da car{{o}{a}})
    [1] => 'o' 'a' cioè (preso da Pin{ {o} {a} }

    il formato da prendere è{{testo anche vuoto}{testo anche vuoto}}oppure con gli spazi { {testo anche vuoto } {testo anche vuoto} }

    se trova {{o}{a} {altro} } è errore perché dentro la graffa ci sono altri 3 contenuti.
    se trova {{o}prova{a}} è errore perché dentro la graffa in mezzo ci sono altri caratteri (prova)

    All'interno delle graffe annidate ci può essere qualunque carattere o testo (anche alfanumerico) l'importante è che rispetti il formato.

    allora ho provato a fare cosi:

    codice:
    $testo = "ciao car{{o}{a}}  anonimo questo è un messaggio scritto da Pin{ {o} {a} } altro testo...non deve prendere {{o} txt {a}}";
    $regex = "/\[{{^}{^}}]*\]/"; 
    preg_match_all($regex,$testo,$campi); 
    
    echo $campi; // dà array vuoto
    la sintassi della regex dovrebbe essere corretto
    codice:
    $regex = "/\[{{^}{^}}]*\]/"; // cerca '{{' prende tutti i caratteri con ^ chiude graffa '}' '{' idem chiude graffa 1 e 2 }}
    dove sbaglio?
    grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88
    ho risolto in parte.
    la regex
    codice:
     $regex='#\\{{.+?\\}{.+?\\}}#s';
    prende solo il primo frammento [0] => 'o' 'a' cioè (preso da car{{o}{a}})
    ma non considera spazi cioè non prende{ {o} {a} }

    come posso mettere la condizione per far accettare gli spazi dentro le graffe?

  3. #3
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Prova cosi. Si puo' fare di meglio penso.
    Codice PHP:
    <?php
    $testo 
    "ciao car{{o}{a}}  anonimo questo è un messaggio scritto da Pin{ {o} {a} } altro testo...non deve prendere {{o} txt {a}} car{{b}{r}}o";
    $regex "/\{\s*\{([^}]?)\}\s*\{([^}]?)\}\s*\}/";
    preg_match_all($regex,$testo,$campi); 

    print_r$campi);
    Torna.
    l'array [1] contiene le parti sinistre mentre il [2] le destre.
    codice HTML:
    Array(    
        [0] => Array        (            [0] => {{o}{a}}            [1] => { {o} {a} }            [2] => {{b}{r}}        )
        [1] => Array        (            [0] => o            [1] => o            [2] => b        )
        [2] => Array        (            [0] => a            [1] => a            [2] => r        )
    )
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Prova cosi. Si puo' fare di meglio penso.
    Codice PHP:
    <?php
    $testo 
    "ciao car{{o}{a}}  anonimo questo è un messaggio scritto da Pin{ {o} {a} } altro testo...non deve prendere {{o} txt {a}} car{{b}{r}}o";
    $regex "/\{\s*\{([^}]?)\}\s*\{([^}]?)\}\s*\}/";
    preg_match_all($regex,$testo,$campi); 

    print_r$campi);
    Torna.
    l'array [1] contiene le parti sinistre mentre il [2] le destre.
    codice HTML:
    Array(    
        [0] => Array        (            [0] => {{o}{a}}            [1] => { {o} {a} }            [2] => {{b}{r}}        )
        [1] => Array        (            [0] => o            [1] => o            [2] => b        )
        [2] => Array        (            [0] => a            [1] => a            [2] => r        )
    )

    innanzitutto ti ringrazio.
    la regex che hai scritto purtroppo non legge una stringa dentro la graffa ma solo se c'è un carattere
    {{ciao}{b}}
    deve stampare "ciao", "b"
    invece non considera proprio.
    ho provato a mettere ^ appena aperto la graffa, niente considera solo se c'è una lettera.

  5. #5
    Prova questo pattern, non sono sicuro di aver capito bene se e' quello che ti serve

    codice:
    #\{\s*\{(.*?)\}\s*\{(.*?)\}\s*\}#g

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88
    Quote Originariamente inviata da k.b Visualizza il messaggio
    Prova questo pattern, non sono sicuro di aver capito bene se e' quello che ti serve

    codice:
    #\{\s*\{(.*?)\}\s*\{(.*?)\}\s*\}#g
    no non funziona.

    in pratica se ho una stringa {{a}{b}}, altro testo, {{parola}}{{pippo}},..altro testo
    deve uscire fuori
    "a" "b"
    "parola" "pippo"
    il problema è che l'espressione scritto non prende le parole contenuto all'interno della graffa e quindi non mi restituisce "parola" "pippo"

  7. #7
    Innanzi tutto l'esempio "{{parola}}{{pippo}}" non rispetta la sintassi che hai definito (ci sono troppe parentesi), ma a parte quello mi sembra funzionare:

    Codice PHP:
    $str 'in pratica se ho una stringa {{a}{b}}, altro testo, {{parola}{pippo}},..altro testo';

    preg_match_all('#\{\s*\{(.*?)\}\s*\{(.*?)\}\s*\}#'$str$matchPREG_SET_ORDER);

    print_r($match); 
    output:
    codice:
    Array
    (
        [0] => Array
            (
                [0] => {{a}{b}}
                [1] => a
                [2] => b
            )
    
        [1] => Array
            (
                [0] => {{parola}{pippo}}
                [1] => parola
                [2] => pippo
            )
    
    )

  8. #8
    Scusa, correzione al pattern:

    Codice PHP:
    preg_match_all('#\{\s*\{([^{}]*)\}\s*\{([^{}]*)\}\s*\}#'$str$matchPREG_SET_ORDER); 

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88
    ok funziona.
    grazie ad entrambi !

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.