Visualizzazione risultati 1 fino 18 di 18

Discussione: Sostituzione con espressioni regolari

  1. #1
    Guest

    Predefinito Sostituzione con espressioni regolari

    Ciao a tutti, ho un problema legato alla sostituzione con le espressioni regolari.
    Ho una variabile $text contenente del testo.

    Dovrei sostituire una seconda stringa $stringa quando nella stringa $text trovo l'occorrenza <testo> testo a caso </testo>

    Sapete come aiutarmi?

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    A domanda generica, risposta generica: usa preg_replace() o preg_replace_callback() se devi fare qualcosa di più complicato.

  3. #3
    Guest

    Predefinito

    Ci avevo già provato, magari sbaglio qualcosa ho scritto questo:

    Codice PHP:
    $testo = preg_replace('/\[TESTO type=\'(.*)\'\](.*)\[\/TESTO\]/',"testo di prova",$testo);
    Quindi devo sostituire questo: [TESTO type='tipo testo']stringa[/TESTO]
    Con questo: testo di prova

  4. #4
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    Beh, adesso la domanda è più specifica almeno

    Prima cosa: se hai una stringa piena di apici singoli, evita di delimitarla con apici singoli, ed avrai una vita più facile. Seconda cosa: se hai un'espressione regolare che contiene '/', evita di delimitarla con '/' ed avrai una vita ancora più facile.

    Si può quindi riscrivere la tua riga così, con i doppi \\ al posto dei singoli (che era il problema sopra)

    Codice PHP:
    $testo = preg_replace("#\\[testo type='(.*)'\\](.*)\\[/testo\\]#i","testo di prova", $testo);
    aggiungo anche una i in fondo per rendere l'espressione regolare case insensitive, così funziona per maiuscole e minuscole.

  5. #5
    Guest

    Predefinito

    Grazie mille il codice che mi hai dato funziona, purtroppo non funziona se gli affianco questo:

    Codice PHP:
    $testo = preg_replace("#\\[TESTO type='(.*)'\\](.*)\\[/TESTO\\]#i","testo di prova", $testo);
    $testo = preg_filter('/\[MOVIE\]http:\/\/www.youtube.com\/watch\?v\=(.*)\[\/MOVIE\]/',"<div style='width:550px; margin:5px auto'><iframe width='550' height='309' src='http://www.youtube.com/embed/$1' frameborder='0' allowfullscreen></iframe></div>",$testo);
    Sai dirmi perché?

  6. #6
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    Direi perché hai ignorato i miei suggerimenti sopra, continuando esattamente come prima.

  7. #7
    Guest

    Predefinito

    Ho provato anche così:

    Codice PHP:
    $testo = preg_filter("#\\[MOVIE\\]http://www.youtube.com/watch?v=(.*)\\[/MOVIE\\]#i","<div style='width:550px; margin:5px auto'><iframe width='550' height='309' src='http://www.youtube.com/embed/$1' frameborder='0' allowfullscreen></iframe></div>",$testo);
    Stesso risultato

  8. #8
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    Nota che stai usando preg_filter, invece di preg_replace, che ha un comportamento diverso:
    preg_filter() is identical to preg_replace() except it only returns the (possibly transformed) subjects where there was a match.
    Quindi se $testo non contiene un link a youtube, ti ritrovi con una stringa vuota.

  9. #9
    Guest

    Predefinito

    Citazione Originalmente inviato da dreadnaut Visualizza messaggio
    Nota che stai usando preg_filter, invece di preg_replace, che ha un comportamento diverso:

    Quindi se $testo non contiene un link a youtube, ti ritrovi con una stringa vuota.
    Giusto, non ci avevo fatto caso. ho modificato e ho messo:

    Codice PHP:
    $testo = preg_replace("#\\[MOVIE\\]http://www.youtube.com/watch?v=(.*)\\[/MOVIE\\]#i","<div style='width:550px; margin:5px auto'><iframe width='550' height='309' src='http://www.youtube.com/embed/$1' frameborder='0' allowfullscreen></iframe></div>",$testo);
    Il problema è che non modifica, sbaglio ancora l'espressione regolare?

  10. #10
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    Dove c'è watch?v=. Il punto di domanda è un carattere speciale, che indica che il carattere che lo precede può essere presente, oppure no. Devi proteggere anche quello con una barra (doppia, perché siamo in una stringa)

    Codice PHP:
    $testo = preg_replace("#\\[MOVIE\\]http://www.youtube.com/watch\\?v=(.*)\\[/MOVIE\\]#i","<div style='width:550px; margin:5px auto'><iframe width='550' height='309' src='http://www.youtube.com/embed/$1' frameborder='0' allowfullscreen></iframe></div>",$testo);

  11. #11
    Guest

    Predefinito

    Ci avevo già provato... non cambia, non capisco il perchè ma non avviene la sostituzione

  12. #12
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    A me funziona, quindi il problema sarà altrove

    Codice PHP:
    <?php
    $testo
    = "zumzum [movie]http://www.youtube.com/watch?v=GWBu5yDql6E[/movie] prova prova";
    $testo = preg_replace("#\\[MOVIE\\]http://www.youtube.com/watch\\?v=(.*)\\[/MOVIE\\]#i","<div style='width:550px; margin:5px auto'><iframe width='550' height='309' src='http://www.youtube.com/embed/$1' frameborder='0' allowfullscreen></iframe></div>",$testo);
    echo
    $testo;
    Codice:
    zumzum <div style='width:550px; margin:5px auto'><iframe width='550' height='309' src='http://www.youtube.com/embed/GWBu5yDql6E' frameborder='0' allowfullscreen></iframe></div> prova prova

  13. #13
    Guest

    Predefinito

    Ho risolto! dipendeva tutto da uno spazio, grazie mille.

  14. #14
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    Nota che anche i "." sono caratteri speciali in una regexp, che rappresentano qualsiasi carattere e quindi anche un punto nella stringa $testo. Le tue espressioni funzionano quindi, ma se vuoi essere certo di non convertire cose come "wwwXyoutubeYcom", dovresti proteggere anche quelli.

  15. #15
    Guest

    Predefinito

    Salve scusate l'intrusione, @dreadnaut ti vedo molto esperto, posso chiederti una cosa?

    Supponiamo che come l'altro utente abbia una riga di questo tipo.
    Codice PHP:
    $testo = preg_replace("#\\[TESTO type='(.*)'\\](.*)\\[/TESTO\\]#i","testo di prova", $testo);
    Posso senza sostituire o altro ricavare il valore dei due (.*)? grazie

  16. #16
    Guest

    Predefinito

    Citazione Originalmente inviato da dreadnaut Visualizza messaggio
    Nota che anche i "." sono caratteri speciali in una regexp, che rappresentano qualsiasi carattere e quindi anche un punto nella stringa $testo. Le tue espressioni funzionano quindi, ma se vuoi essere certo di non convertire cose come "wwwXyoutubeYcom", dovresti proteggere anche quelli.
    Grazie mille! ora modifico

  17. #17
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    @socialmy: puoi usare preg_match() e preg_match_all() per confrontare un'espressione regolare con una stringa, ed estrarne gli elementi corrispondenti.

    Un sacco di esempi sulla guida del php, qua sul forum se cerchi preg_match, e su internet in generale

  18. #18
    Guest

    Predefinito

    Ciao, seguendo l'esempio ho provato a scrivere:

    Codice PHP:
    if($result = preg_filter("#\\[TEXT type='(.*)'\\](.*)\\[\/TEXT\\]#i","$1 - $2",$testo))
    {
    $result1 = explode(" - ", $result);
    Ma mi tira giù tutto il testo

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •