Newsgroup: it.comp.www.php
Titolo: Espressioni regolari... :(

Niente da fare, è evidente che con le espressioni regolari ci ho 
litigato da piccolo!!!!!!!!!!
Ho scritto una funzione che elimini tutti i tag del bbcode dal testo di 
un messaggio, ma volevo che ad esempio un tag [b]grassetto[/b] 
diventasse semplicemente grassetto...
La funzione che ho realizzato è questa:
function bbtagPurge ($stringa) {
	$stringa = preg_replace("/\[quote.*\"(.*?)\"\].*?\[\/quote.*
\]/si", "", $stringa); // [quote]
	$stringa = preg_replace("/\[b.*\](.*)\[\/b.*\]/si", "\\1", 
$stringa); // [b]
	$stringa = preg_replace("/\[i.*\](.*)\[\/i.*\]/si", "\\1", 
$stringa); // [i]
	$stringa = preg_replace("/\[u.*\](.*)\[\/u.*\]/si", "\\1", 
$stringa); // [u]
	$stringa = preg_replace("/\[color.*\](.*)\[\/color.*\]/si", "\\1", 
$stringa); // [color]
	$stringa = preg_replace("/\[size.*\](.*)\[\/size.*\]/si", "\\1", 
$stringa); // [size]
	$stringa = preg_replace("/\[code.*\](.*)\[\/code.*\]/si", "\\1", 
$stringa); // [code]
	$stringa = preg_replace("/\[list.*\](.*)\[\/list.*\]/si", "\\1", 
$stringa); // [list]
	$stringa = preg_replace("/\[\*.*\]/si", "", $stringa); // [*]
	$stringa = preg_replace("/\[url.*\](.*)\[\/url.*\]/si", "\\1", 
$stringa); // [url]
	$stringa = preg_replace("/\[email.*\](.*)\[\/email.*\]/si", "\\1", 
$stringa); // [email]
	$stringa = preg_replace("/\[img.*\].*\[\/img.*\]/si", "", 
$stringa); // [img]
	return $stringa;
}
Però purtroppo non interessa nulla che io abbia messo \\1, viene 
eliminato tutto il codice, anche quello inserito tra parentesti ()...
Ho provato anche sostituendo \\1 con \$1 che è il nuovo metodo di 
sostituzione, ma nulla...
Evidentemente il problema sta proprio nelle espressioni regolari...
Chi me la dà una mano?
Grazie!
-- 
Liuk - Cavaliere Jedi | Ex allievo della maestra Alkaid
Email: 
li...@fanwars.it
 - Home Page: 
http://www.fanwars.it
Padre mufhd0 che sei nei server, sia santificato il tuo
hostname, venga il tuo broadcast, sia fatta la tua
configurazione così in linux come in BSD. Dacci oggi il
nostro source quotidiano e rimetti a noi i nostri codici
come noi li rimettiamo ai nostri sviluppatori e non indurci
in segfault ma liberaci da Microsoft.



 La funzione che ho realizzato è questa:
Che casino :)
1- Quando lavori con le regxp fai una cosa alla volta e cerca di vedere 
quale sia la soluzione più "economica".
2- A preg_replace puoi passare anche array come parametri.
Dai un'occhiata alla soluzione qui sotto (testata poco, senza garanzia e 
sicuramente e consapevolmente bacata in caso di medesimi tag annidati - 
ma vuole essere solo un esempio che ti ho buttato giù in pochi minuti, 
non la soluzione del tuo problema)
<?php
function bbtagPurge ($stringa) {
	$stringa = preg_replace("/\[b[^\]]*\](.*)\[\/b[^\]]*\]/sim", "<font 
style=\"font-weight: bold;\">$1</font>", $stringa);
 
	$tags = array 
('quote','i','u','color','size','code','list','email','url','img','quellochetipare');
 
	foreach ($tags as $tag) {
		$ar_search[] = "/(\[\/?".$tag."[^\]]*\])/sim";
	}
 
	$replace = "";
 
	$stringa = preg_replace($ar_search,$replace,$stringa);
	return $stringa;
}
$stringa = "oij [b]inihiu [/b]ioj  oij ccc [quote] p
ioijji [/quote]aaagtgr[img ihihh]sss";
$stringa = bbtagPurge($stringa);
echo $stringa;
?>
Se tu vuoi eliminare un tag non devi cercare quello che ci sta in 
mezzo... cerca il tag.. considerando che può essere sia di apertura che 
di chiusura.. e poi lo sostituisci con una stringa vuota.
Nel caso del [b] - a parte che si può fare benissimo anche con un 
str_replace ed è anche meglio - l'approccio può essere anche al 
contrario visto che la soluzione è più elegante e leggibile.
In queste cose cerca sempre la strada più semplice e breve (proprio per 
questo non mi sono messo a guardare nei dettagli la tua funzione: magari 
ho dimenticato qualcosa nella soluzione che ti ho proposto ma un codice 
di quel tipo si fa leggere con decisamente poca voglia)
---
"Basta con questa vita, voglio farmi una famiglia". "Esagerato... fatti 
solo la più carina di tutta la famiglia" (Alessandro Bergonzoni).