Visualizzazione risultati 1 fino 9 di 9

Discussione: [PHP] Problema con 2 preg_replace

  1. #1
    Guest

    Predefinito [PHP] Problema con 2 preg_replace

    Salve a tutti, ho un piccolo problema con due preg_replace:

    Codice PHP:
    $stringa = preg_replace('/\[decode\](.+?)\[\/decode\]/eis', '"\[decode\]".strip_tags("\\1")."\[\/decode\]"', $stringa);

    $stringa = preg_replace('/\[decode\](.+?)\[\/decode\]/eis', '"<div class=\"decode\">".html_entity_decode("\\1")."<\/div>"', $stringa);
    se le uso una alla volta funzionano e fanno il loro dovere ma se le uso contemporaneamente nell'ordine in cui le ho scritte qui sopra, funziona solo la prima... sapete dirmi il perchè e come rimediare?

    grazie,
    ciao.

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

    Predefinito

    Hai provato a stampare stringa a metà strada, e vedere cosa c'è dentro? Ad occhio ci sono troppe barre di escape nella stringa di sostituzione, dove non dovrebbero essere necessarie.

    Per sicurezza: quelle chiamate a funzione dentro le stringhe ovviamente sai che non funzionano vero? Stringa contiene del codice php alla fine?

  3. #3
    Guest

    Predefinito

    celere come al solito, ti ringrazio.

    Ti spiego meglio il problema, lo script agisce su articoli del sito inseriti nel database nel quale viene usato una sorta di bbcode artigianale sia per facilitarmi il lavoro che per sicurezza.

    in pratica è una serie di preg_replace() che trasforma i tag bbcode in html in fase di resa.
    quelle due sono la parte che mi permette di inserire delle finestrelle di esempio di come funzionano i tag del codice nell'area del mio sito dove sto provando a fare una guida all'html mettendo un codice del tipo [decode]codice_html[/decode].

    in effetti sarebbe abbastanza inutile se non fosse che in fase di scrittura l'articolo passa da un htmlentities() sempre per questioni di sicurezza e quindi i tag diventano i rispettivi caratteri e non funzionano.

    La prima funzione serve per eliminare i <br /> che essendo aggiunti in fase di resa da una nl2br() sono tag veri e propri e non traduzioni dei caratteri in entità html, ma che nella resa del codice aggiungono <br /> che non ci dovrebbero essere.

    Ora, come avevo accennato nel primo post, se faccio funzionare una sola delle due (mettendo l'altra tra /* */) funzioni e fa ciò che deve fare, e questo sia per la prima che per la seconda, ma se le faccio funzionare entrambe contemporaneamente funziona solo la prima come se non trovasse match per la stringa cercata... ma è una cosa un po' strana dato che la prima cerca la stessa identica cosa e la trova.

    PS: la stringa proviene da un database, quindi e stata passata da un addslashes().

    Fammi sapere se ti viene in mente qualcosa... ti ringrazio ancora

    ciao
    Ultima modifica di opens : 18-08-2010 alle ore 02.18.12

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

    Predefinito

    Un sacco di roba che non mi serve sapere, quindi ti ripeto esattamente quello che ho scritto sopra, a cui non hai risposto:

    Hai provato a stampare la stringa fra le due chiamate, per vedere cosa contiene? A mio parere nelle stringhe di rimpiazzo ci sono troppe barre, ad esempio davanti alle parentesi quadre, per cui [decode] diventa \[decode\] che la seconda regexp non riconosce.

    Inoltre, sei conscio che le chiamate a strip_tags e html_entity_decode non vengono eseguite in quel punto? Se verrano eseguite più tardi, non è un problema, ma vorrei conferma.

  5. #5
    Guest

    Predefinito

    Si hai ragione, pensavo che si capisse dal fatto che avevo fatto funzionare solo una funzione per vedere cosa dava che gli avevo fatto stampare quello che c'era tra le due funzioni, ma vabè.

    Comunque avevi ragione era un problema di troppe back-slash, ma solo nella parte rimpiazzata non in quella cercata e non capisco bene come mai se cerco una striga e la rimpiazzo con la stessa poi non me la trova più...

    ----

    EDIT: i back-slash nella parte cercata servono per non far finire la stringa con gli / nella ricerca preg ed evitare che prenda i [] come gruppi di lettere, quindi nella stringa da ricercare ci devono essere.
    Ultima modifica di opens : 18-08-2010 alle ore 15.18.16

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

    Predefinito

    Devi leggere con più calma, e forse io devo sottolineare di più le cose. Sopra avevo in effetti scritto "le stringhe ti rimpiazzo".

    Nel caso ti torni utile, ricorda che una regexp non deve per forza essere scritta /qualcosa/, ma al posto delle barre puoi usare qualsiasi carattere. L'importante è che appaia solo all'inizio e alla fine, oppure protetto dalla solita barra \. Io ad esempio tendo ad usare il #, dato che la barra appare spesso in html e simili, e.g. #\[/decode\]#
    Ultima modifica di dreadnaut : 19-08-2010 alle ore 02.38.20

  7. #7
    Guest

    Predefinito

    io uso quelle perchè così ho trovato nelle guide preg di php, pensavo fosse una sintassi standard.
    E' una buona dritta quella che mi hai dato, in effetti in html gli slash appaiono praticamente ovunque. Comunque ora funziona tutto a dovere.

    Ciao

    PS: Per sottolineare che tendo a leggere troppo frettolosamente (di solito leggo la notte tardi ed il sonno influisce molto) mi sono accorto ora di:
    Per sicurezza: quelle chiamate a funzione dentro le stringhe ovviamente sai che non funzionano vero? Stringa contiene del codice php alla fine?
    intendi strip_tags() e html_entity_decode() ? perchè funzionano, non restituisce codice PHP, ma l'applicazione della funzione.
    Ultima modifica di opens : 19-08-2010 alle ore 18.38.05

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

    Predefinito

    Citazione Originalmente inviato da opens Visualizza messaggio
    intendi strip_tags() e html_entity_decode() ? perchè funzionano, non restituisce codice PHP, ma l'applicazione della funzione.
    Si, mi ero perso io il fatto che le tue espressioni avessere l'opzione e in fondo, che fa eseguire la stringa di sostituzione come php

  9. #9
    Guest

    Predefinito

    dove si mete sto codice grazie

Regole di scrittura

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