PDA

View Full Version : [PHP] espressione regolare per sostituzione sottostringa


AMD_GO
02-11-2010, 16:33
salve ragazzi, dovrei manipolare una stringa in php. Avendo, ad esempio la seguente stringa

$str = "blablabla ciao ciao ciao"

vorrei eliminare la porzione di quote, in modo che risulti

$str = "ciao ciao ciao"

magari utilizzando un'espressione regolare PCRE. per farla breve voglio sostituire la sottostringa "[quote=user]blablabla[\quote]" con una stringa vuota....ma...come costruire l'espressione regolare??? ho cercato di capire come funziona la sintassi delle reg ex ma non ho capito tanto bene.....oppure c'è un modo che evita l'utilizzo di espressioni regolari???

Inoltre potrebbero esserci più quote indentati.....


Grazie a tutti!!!!!!!!!!!!

MEMon
02-11-2010, 18:43
Ciao, usa questa


\[quote(=.*?)*\]|\[\\quote\]


Volendo si può fare anche più raffinata (tipo catturare [\quote] solo se prima c'è [quote] e viceversa).

AMD_GO
03-11-2010, 09:12
Ciao, usa questa


\[quote(=.*?)*\]|\[\\quote\]


Volendo si può fare anche più raffinata (tipo catturare [\quote] solo se prima c'è [.quote] e viceversa).

ciao! grazie mille per la risposta....ho provato ma mi da il seguente errore


[phpBB Debug] PHP Notice: in file /viewtopic.php on line 1674: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash

ho potuto leggere e vedere che le PCRE hanno una sintassi diversa dalle POSIX....

AMD_GO
03-11-2010, 12:19
ci sono quasi.....ecco la reg exp che funziona a metà....

$str = preg_replace('/\[quote=(.+)\]|\[\\quote:(.+)\]/', 'sost_pattern', $testo);

funziona a metà perchè quando è presente un solo livello di quote tutto ok, ma se ci sono più quote nidificati non me li elimina tutti...es

$str = "[quote=user][quote=user]blablabla[/quote:un_codice]ciao2 ciao2[/quote:un_codice] ciao ciao ciao"

se applico la funzione di sopra mi restituisce

$str = "ciao2 ciao2[/quote:un_codice] ciao ciao ciao"


ci vorrebbe qualcosa di ricorsivo.....tipo come qui
http://www.php.net/manual/en/regexp.reference.recursive.php

solo dovrei prima decifrarlo!!!

MEMon
03-11-2010, 12:30
ciao! grazie mille per la risposta....ho provato ma mi da il seguente errore


[phpBB Debug] PHP Notice: in file /viewtopic.php on line 1674: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash

ho potuto leggere e vedere che le PCRE hanno una sintassi diversa dalle POSIX....

Se usi preg_replace va bene quella che ti ho scritto, l'errore è che devi usare anche // per delimitare la regex.

Comunque se devi catturare anche [\quote:codice] (questo nel primo post non l'hai detto), usa questa

$pattern="/\[quote(=.*?)*\]|\[\/quote(:.*?)*\]/";

AMD_GO
03-11-2010, 13:24
Se usi preg_replace va bene quella che ti ho scritto, l'errore è che devi usare anche // per delimitare la regex.

Comunque se devi catturare anche [\quote:codice] (questo nel primo post non l'hai detto), usa questa

$pattern="/\[quote(=.*?)*\]|\[\/quote(:.*?)*\]/";


grazie ancora...si, la tua ora funziona, mi toglie tutti i quote, solo che mi lascia ciò che c'è dentro i quote, e io vorrei togliere pure quello che c'è dentro (come nell'esempio del primo post)!!! :D

MEMon
03-11-2010, 20:14
grazie ancora...si, la tua ora funziona, mi toglie tutti i quote, solo che mi lascia ciò che c'è dentro i quote, e io vorrei togliere pure quello che c'è dentro (come nell'esempio del primo post)!!! :D

Si scusami, questa volta è colpa mia che avevo letto male :D

Questa dovrebbe fare al caso tuo, per intenderci questa è la prova che ho fatto io:

$pattern="/\[quote(=.*?)*\](.+?)\[\/quote(:.*?)*\](.+?\[\/quote(:.*?)*\])*/";
$input="hello [quote=A]aaa[quote=B]bbbbbb[quote=C]ccccc[/quote:C]bbbbb[/quote:B]aaaaaa[/quote:A]world";
$result="hello world";


Spero comprenda tutti i vari casi che ti sei posto.

AMD_GO
03-11-2010, 21:26
non maledirmi, ma come mai su questa stringa non funziona???

[quote="andrea":egfwrdpy][quote="andrea":egfwrdpy] testo[/quote:egfwrdpy] ciao! [/quote:egfwrdpy] prova


dovrebbe risultare solo "prova", invece risulta "ciao! [/quote:egfwrdpy] prova".

è vero che è un po' diversa, ma il pattern dovrebbe funzionare lo stesso...

PS: non ti ho detto subito di quest'ultima stringa perchè volevo arrivarci da solo!

MEMon
03-11-2010, 21:34
A me pare funzioni, io le provo qui: http://www.gskinner.com/RegExr/