Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
Php,preg_replace e BBcode
Nuovo argomento   Rispondi    Indice del forum -> Linguaggi per Internet
Precedente :: Successivo  
Autore Messaggio
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 03 Set 2012 15:11    Oggetto: Php,preg_replace e BBcode Rispondi citando

Ciao a tutti,
sono un po' arrugginito con le espressioni regolari e son qui per chiedere un aiutino: ho bisogno di far saltare da una stringa, tutti i tag bbcode che incontro (ma non il testo da formattare).
Pensavo di usare preg_replace() dandogli come primo parametro un array contenente il pattern per i tag di apertura (che possono avere attributi) e quello di chiusura.
Per la chiusura no problem, tramite la regex:
Codice:

/\[\/.+\]/

i tag di chiusura spariscono.
Ma per l'apertura non mi quadra la non interpretazione del quantificatore +:
Codice:

/\[.+\]/

La regex qui sopra non funziona, non viene riscontrato nessun match se per esempio ho una stringa:
Codice:

[B]ciao[/B]

Io mi sarei aspettato di trovare "[B]".
Se però rimuovo il + il match avviene ma a me serve perchè potrei avere bbcode con più lettere e comunque con un attributo come per esempio:
Codice:

[url=www...]bau[/url]

Testando con due tools online ottengo sempre picche quindi credo che effettivamente stia usando male il +.
In pratica ho bisogno di tradurre in regex:
Codice:

trova tutte le sequenze che iniziano con il carattere "[" seguito da un gruppo di caratteri di almeno uno seguito da "]".

Qualcuno mi può dare una mano?

Thanks!
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11566
Residenza: Tokelau

MessaggioInviato: 03 Set 2012 15:22    Oggetto: Rispondi citando

stai usando il / per delimitare?
comunque \[.+\] dovrebbe essere giusto, non ho idea di perché non debba andare... ma se non va fai \[..*\] a quel punto...

edit: aspetta, forse il problema è che devi usare operatori non greedy (lazy)?
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 03 Set 2012 15:38    Oggetto: Rispondi citando

Ciao SverX,
sì, uso lo / per chiudere il tag.
Seguendo i tuoi suggerimenti ho fatto un po' di prove sia con gli operatori lazy che con i greedy ma non cambia nulla.
Al massimo sono arrivato a far saltar via la quadra di chiusura del tag di apertura.
Con \[..*\] mi vengono rancati sia i tag di apertura che di chiusura ma anche il contenuto (che purtroppo deve restare).

La cosa che non capisco è il perchè il + funzioni nella chiusura ma non nell'apertura visto che il + agisce sul . e basta e non su tutto quello che lo precede.
Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 03 Set 2012 16:49    Oggetto: Rispondi citando

Svelato l'arcano ma non ho ancora la regex che mi serve.
Mi son accorto che i due test online che ho usato il match lo trovavano solo che con la mia regex il match è tutta la stringa compresa tra i due tag.
Infatti:
Codice:

trova tutte le sequenze che iniziano con il carattere "[" seguito da un gruppo di caratteri di almeno uno seguito da "]".

ha come match una stringa del tipo:
Codice:

[B]ciao ciao ciao[/B]

ossia la prima quadra, una serie di almeno un carattere formata da qualunque simbolo (quadre comprese) e poi una quadra chiusa.

Quindi rigiro la domanda: cosa uso per rimuovere i tag nelle forme:
Codice:

[B]
oppure
[B=pippo]

con B qualunque sequenza di lettere?
Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 03 Set 2012 17:18    Oggetto: Rispondi citando

Dunque,
anche se potrebbe diventare più precisa son riuscito a creare una regex che sembra funzionare, anzi, da sola mi fa saltare sia l'apertura che la chiusura.
Codice:

/\[[^\].]+\]/

però che palle gente Very Happy
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11566
Residenza: Tokelau

MessaggioInviato: 04 Set 2012 10:25    Oggetto: Rispondi citando

mmm... ti fa saltare anche i tag singoli?
comunque forse è meglio:
Codice:
\[\/?.+?\]

(se funziona). Ovvero qualunque stringa che:
inizia con [
opzionalmente seguita da /
seguita da 1 o più caratteri qualsiasi, fino a trovare il primo ] (usando il modificatore ungreedy ? sul + )
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 04 Set 2012 11:32    Oggetto: Rispondi

Ciao,
la mia regex pare andare e credo che faccia saltare anche il tag singolo (devo provare).
Farò anche dei test con la tua versione che effettivamente è più corretta.
Ti tengo comunque aggiornato.

Thanks.
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Linguaggi per Internet Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi