Domanda sul str_replace
Domanda sul str_replace postato il 14/01/2013 00:32:36 nel forum programmazione, open source e hosting
Buonasera a tutti ^_^
Ho una domanda sul famoso str_replace con il quale in lang gestisco il cambio di font tra parlato e azione.
Mi piacerebbe sfruttare questa funzione per far stampare in chat a determinati player una cosa ed ad altri un'altra...Mi spiego meglio...
In land alcuni player seguono un corso di lingua aliena (il goa'uld) al termine del quale in gioco si assume che sappiano capire e parlare il Goa'uld.
Ora, fino ad oggi ogni player leggeva in chat le frasi scritte in goauld, in quanto si scriveva semplicemente:
NomePG: <Si rivolge all'alieno parlando in Goa'uld dicendo> Buonasera, sono i Dottor TaldeiTali...
Poi ci si giocava semplicemente che CHI in on sa il goa'uld, capisce la frase del PG, chi non lo sa, si gicoava di sentire "parole strane e senza senso".
Premesso questo, pensavo di modificare il refresh.php così da contenere qualcosa tipo:
if (PG NON conosce il Goauld)
$testo = str_replace('#', '<i>Chi non conosce la lingua GoaUld non comprende</i></font>';
$testo = str_replace('@', '</font> <font color=cccccc>', $testo);
if (PG conosce il Goauld)
$testo = str_replace('#', '<i>', $testo);
$testo = str_replace('@', '</i> ', $testo);
Solo che c'è un ovvio errore nella prima sostituzione, che causa che TUTTO il testo dopo il primo # "svanisca" e venga sostituito da "Chi non conosce..."
La mia soluzione "low-tech" è stata:
if (PG NON conosce il Goauld)
$testo = str_replace('#', '<i>Chi non conosce la lingua GoaUld non comprende</i></font> <font style="font-size: 0pt;">', $testo);
$testo = str_replace('@', '</font> <font color=cccccc>', $testo)
Ora, chi non capisce vede "solo uno spazio" in chat (che sarebbe il testo a size: 0pt).
Funziona quindi, e in fin dei conti potrei anche fermarmi, perché è ovvio che copiando ed incollando quello "spazio" dalla chat in un notepad si legge la scritta goauld...MA più che un verso segreto OFF io lo farei per un "aspetto grafico" più piacevole... Chi si vuole leggere anche il goa'uld...amen, tanto in ON non può sfruttare questa conoscenza. Ma, in teoria, come potrei scrivere questa sostituzione in maniera più corretta e più funzionale?
Grazie a tutti :-)
Pagine → 1
14/01/2013 02:18:39
Se non ho capito male la frase scritta in quella lingua è racchiusa da #frase@ giusto?
in quel caso secondo me più che un str_replace ti converrebbe usare un preg replace con una semplice regexp
del tipo:
if (se il pg non conosce la lingua) {
$regexp = array ('/#(.*?)@/si' => '<i>Chi non conosce la lingua GoaUld non comprende</i>');
} else {
$regexp = array ('/#(.*?)@/si' => '<i>\\1</i>');
}
$testo = preg_replace(array_keys($regexp ), array_values($regexp ), $testo );
in questo modo quando il preg replace trova qualcosa contenuto tra # @ se il pg conosce la lingua lo sostituisce con il contenuto tra i due simboli, altrimenti elimina il contenuto e lo sostituisce con la scritta.
\\1 rappresenta infatti il contenuto di (.*?)
15/01/2013 21:29:11
dyrr ha scritto: Se non ho capito male la frase scritta in quella lingua è racchiusa da #frase@ giusto?
in quel caso secondo me più che un str_replace ti converrebbe usare un preg replace con una semplice regexp
del tipo:
if (se il pg non conosce la lingua) {
$regexp = array ('/#(.*?)@/si' => '<i>Chi non conosce la lingua GoaUld non comprende</i>');
} else {
$regexp = array ('/#(.*?)@/si' => '<i>\1</i>');
}
$testo = preg_replace(array_keys($regexp ), array_values($regexp ), $testo );
in questo modo quando il preg replace trova qualcosa contenuto tra # @ se il pg conosce la lingua lo sostituisce con il contenuto tra i due simboli, altrimenti elimina il contenuto e lo sostituisce con la scritta.
\1 rappresenta infatti il contenuto di (.*?)
dyrr, funziona perfettamente!
Un codice molto più pulito e funzionale, grazie mille :-)
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Tiles Survive ↗
Seconda Era ↗
Crossout ↗