[RISOLTO]Gdrcd, parentesi angolari
[RISOLTO]Gdrcd, parentesi angolari postato il 11/07/2021 11:31:23 nel forum programmazione, open source e hosting e modificato da angel1989 il 11/07/2021 17:45:25
Salve a tutti. Ho un problema con il codice del parlato.
Talvolta, infatti, capita che giocando ci si scordi di chiude un discorso diretto. In questo caso un'azione come questa:
Vediamo cosa succede se sbaglio aprendo <poi aprendo una seconda volta <senza aver chiuso la precedente>
compare in cha così:
Vediamo cosa succede se sbaglio aprendo <poi aprendo una seconda volta
Questo perché sul db l'azione viene salvata così:
Vediamo cosa succede se invece spaglio aprendo [poi aprendo una seconda volta <senza aver chiuso la precedente]
Per ovviare ho modificato la funzione:
function gdrcd_angs($str) {
$search = [
'#\<(.+?)\>#is',
'#\<(.+?)>#is',
];
$replace = [
'[$1]',
'[$1]',
];
return preg_replace($search, $replace, $str);
}
in questa maniera:
function gdrcd_angs($str) {
$search = [
'#\<(.+?)\>#is',
'#\<(.+?)>#is',
'#\<#is',
'#\>#is',
];
$replace = [
'[$1]',
'[$1]',
'[',
']',
];
return preg_replace($search, $replace, $str);
}
Però, come potete capire non mi fa impazzire.
E' la prima volta che mi capita una cosa del genere. Smanetto con gdrcd da parecchio tempo e di solito questo inconveniente non si presenta e vorrei capire cosa io possa aver modificato. Anche perché non mi pare di aver modificato nulla:
In functions.inc.php abbiamo:
function gdrcd_filter($what, $str) {
switch(strtolower($what)) {
case 'in':
case 'get':
$str = addslashes(str_replace('\\', '', $str));
break;
case 'num':
$str = (int) $str;
break;
case 'out':
$str = html_entity_decode($str, ENT_HTML5, 'utf-8');
break;
case 'addslashes':
$str = addslashes($str);
break;
case 'email':
$str = (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]+\.[a-z]{2,4}$#is", $str)) ? $str : false;
break;
case 'includes':
$str = (preg_match("#[^:]#is")) ? htmlentities($str, ENT_QUOTES) : false;
break;
case 'url':
$str = urlencode($str);
break;
case 'fullurl':
$str = filter_var(str_replace(' ', '%20', $str), FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED);
break;
}
return $str;
}
function gdrcd_angs($str) {
$search = [
'#\<(.+?)\>#is',
'#\<(.+?)>#is',
'#\<#is',
'#\>#is',
];
$replace = [
'[$1]',
'[$1]',
'[',
']',
];
return preg_replace($search, $replace, $str);
}
/**
* Colora in HTML le parti di testo comprese tra parentesi angolari o parentesi quadre
* Si usa in chat
* @param string $str : la stringa da controllare
* @return $str con la parti colorate
*/
function gdrcd_chatcolor($str) {
$search = [
'#\<(.+?)\>#is',
'#\[(.+?)\]#is',
];
$replace = [
'<span class="color2"><$1></span>',
'<span class="color2"><$1></span>',
];
return preg_replace($search, $replace, $str);
}
/**
* Sottolinea in HTML una stringa presente in un testo. Usata per sottolineare il proprio nome in chat
* @param string $user : la stringa da sottolineare, in genere un nome utente
* @param string $str : la stringa in cui cercare e sottolineare $user
* @return $str con tutte le occorrenze di $user sottolineate
*/
function gdrcd_chatme($user, $str, $master = false) {
$search = "|\\b".preg_quote($user, "|")."\\b|si";
if( ! $master) {
$replace = '<span class="chat_me">'.gdrcd_filter('out', $user).'</span>';
} else {
$replace = '<span class="chat_me_master">'.gdrcd_filter('out', $user).'</span>';
}
return preg_replace($search, $replace, $str);
}
In ref_header.inc.php invece:
$chat_message=gdrcd_filter('in', gdrcd_angs($_POST['message']));
$add_chat.= '<span class="chat_msg">'.gdrcd_chatme($_SESSION['login'], gdrcd_chatcolor(gdrcd_filter('out',$row['testo']))).'</span>';
Qualcuno riesce a capire dove sia il problema?
Pagine → 1
11/07/2021 12:21:54 e modificato da soizora il 11/07/2021 12:22:17
Quel comportamento che segnali con quel codice che hai evidenziato è normale, però scusami ma non riesco a capire che comportamento ti aspetteresti al suo posto. Potresti rifare l'esempio più chiaramente?
11/07/2021 12:46:42
Nella vecchia versione di gdrcd scrivendo un'azione come:
Vediamo cosa succede se sbaglio aprendo <poi aprendo una seconda volta <senza aver chiuso la precedente>
in chat l'azione compariva così:
Vediamo cosa succede se sbaglio aprendo <poi aprendo una seconda volta <senza aver chiuso la precedente>
Niente veniva tagliato come invece succede ora. Vorrei capire il perché e come ovviare.
11/07/2021 13:17:57
Non mi ricordo se avevo risolto così:
/**
* Sostituisce eventuali parentesi angolari in coppia in una stringa con parentesi quadre
* @param string $str : la stringa da controllare
* @return $str con la coppie di parentesi angolari sostituite con parentesi quadre
*/
function gdrcd_angs($str) {
$search = [
'#\<#is',
'#\>#is',
];
$replace = [
'«',
'»',
];
return preg_replace($search, $replace, $str);
}
11/07/2021 14:32:22
ma in pratica se non vuoi che le parentesi angolari vengano sostituite dalle quadre, non è sufficiente non usare la funzione gdrcd_angs del tutto?
11/07/2021 14:42:10
forsaken ha scritto: Ho controllato e da me funziona, su functions ho scritto così:
/**
* Sostituisce eventuali parentesi angolari in coppia in una stringa con parentesi quadre
* @param string $str: la stringa da controllare
* @return $str con la coppie di parentesi angolari sostituite con parentesi quadre
*/
function gdrcd_angs($str)
{
$search = array(
'#\<(.+?)\>#is',
'#\<(.+?)>#is',
);
$replace = array(
'[$1]',
'[$1]',
);
return preg_replace($search, $replace, $str);
}
In chat appare così:

E la cosa scritta nella textarea prima di inviare era:
testo < che dovrebbe stare < nelle parentesi ma sbagliamo >
Ho provato e purtroppo non mi risolve nulla. Nel senso: è vero quel che hai scritto, ma funziona bene solo se inserisci lo spazio tra le parentesi uncinate e la scritta. Se non lo fai sei punto a capo. Mentre in Gdrcd 5.4 il problema non si presentava neppure senza spazio.
11/07/2021 17:44:28
Vi ringrazio per le risposte e scusate se ho aperto una nuova discussione per qualcosa di già presente. Ho cercato prima di aprire questa ma non ho trovato nulla.
Per quanto la vostra soluzione in effetti funzioni, me ne hanno suggerito un'altra che per quanto ci riguarda funziona meglio. Infatti volevamo qualcosa che non modificasse le parentesi angolari in fase di stampa sullo schermo.
Questo si può ottenere modificando ref_header.inc.php nel caso P dello switch del tipo di azione da così:
$add_chat.=': </span> ';
$add_chat.= '<span class="chat_msg">'.gdrcd_chatme($_SESSION['login'], gdrcd_chatcolor(gdrcd_filter('out',$row['testo']))).'</span>';
a così:
$add_chat.=': </span> ';
$testo_pulito = htmlspecialchars($row['testo']);
$add_chat.= '<span class="chat_msg">'.gdrcd_chatme($_SESSION['login'], gdrcd_chatcolor(gdrcd_angs($testo_pulito))).'</span>';
11/07/2021 18:02:51
Okkei h finalmente capito il punto della discussione. Praticamente il problema è che non ti colora in grassetto le scritte e si limita a sostituirti con parentesi quadre le parentesi angolari? Bhe per forza, ho confrontato il codice che hai messo tu:
function gdrcd_angs($str) {
$search = [
'#\<(.+?)\>#is',
'#\<(.+?)>#is',
];
$replace = [
'[$1]',
'[$1]',
];
return preg_replace($search, $replace, $str);
}
con quello di una qualsiasi versione di gdrcd precedente:
function gdrcd_chatcolor($str)
{
$search = array(
'#\<(.+?)\>#is',
'#\[(.+?)\]#is',
);
$replace = array(
'<span class="color2"><$1></span>',
'<span class="color2"><$1></span>',
);
return preg_replace($search, $replace, $str);
}
Non pè difficile rendersi conto del perchè del comportamento: I due codici fanno due cose completamente diverse. Il primo si limita solo a sostituire parentesi ang con quadre, il secondo invece sostituisce sia le angolari che le quadre con il marker html più consono per dare l'effetto colorato.
Francamente non so cosa pensare delle ultime versioni di gdrcd, non è il primo strafalcione madornale che trovo di questo tipo.
11/07/2021 20:16:42 e modificato da angel1989 il 11/07/2021 20:19:39
soizora ha scritto: Okkei h finalmente capito il punto della discussione. Praticamente il problema è che non ti colora in grassetto le scritte e si limita a sostituirti con parentesi quadre le parentesi angolari? Bhe per forza, ho confrontato il codice che hai messo tu:
function gdrcd_angs($str) {
$search = [
'#\<(.+?)\>#is',
'#\<(.+?)>#is',
];
$replace = [
'[$1]',
'[$1]',
];
return preg_replace($search, $replace, $str);
}
con quello di una qualsiasi versione di gdrcd precedente:
function gdrcd_chatcolor($str)
{
$search = array(
'#\<(.+?)\>#is',
'#\[(.+?)\]#is',
);
$replace = array(
'<span class="color2"><$1></span>',
'<span class="color2"><$1></span>',
);
return preg_replace($search, $replace, $str);
}
Non pè difficile rendersi conto del perché del comportamento: I due codici fanno due cose completamente diverse. Il primo si limita solo a sostituire parentesi ang con quadre, il secondo invece sostituisce sia le angolari che le quadre con il marker html più consono per dare l'effetto colorato.
Francamente non so cosa pensare delle ultime versioni di gdrcd, non è il primo strafalcione madornale che trovo di questo tipo.
No, temo proprio di non essermi spiegato bene XD
Con gdrcd 5.5 senza modifiche se io invio in chat questa azione:
testo <che dovrebbe stare <nelle parentesi ma sbagliamo>
Questa parte:
<nelle parentesi ma sbagliamo>
non viene stampata. Perché nel db l'azione viene salvata così:
testo [che dovrebbe stare <nelle parentesi ma sbagliamo]
Quindi io per non perdere pezzi di azioni a causa di errori di battitura dei giocatori ho aggiunto alla funzione che sostituisce alla coppie di < > le [ ] che anche una singola < o una singola > venissero tramutate in parentesi quadre aperta o chiusa. Così in chat mi stampava questo:
testo <che dovrebbe stare [nelle parentesi ma sbagliamo>
Quindi ero conscio di cosa avessi fatto, solo che non mi piaceva come soluzione e sono venuto qui a chiedere se qualcuno ne avesse un'altra.
Credo che il problema si trovi in una commistione di filtro dell'html alto e la chiusura dei tag. Anche se non avrei idea di che modifiche apportare per risolverlo alla radice.
12/07/2021 14:13:20
Purtroppo, non esiste una soluzione semplice al problema.
Per cercare di correggere in corsia tutti i possibili strafalcioni degli utenti in termini di apertura e chiusura tag andrebbero ripensate le funzioni esistenti e, laddove è possibile, implementare una funzionalità di preview dell'azione in modo che l'utente possa notare subito gli errori e correggerli prima di inviare.
In ogni caso, senza andare troppo a scomodare le regexr, personalmente adotterei la soluzione di @haruka .
/**
* Sostituisce eventuali parentesi angolari in coppia in una stringa con parentesi quadre
* @param string $str : la stringa da controllare
* @return $str con la coppie di parentesi angolari sostituite con parentesi quadre
*/
function gdrcd_angs($str) {
$search = [
'#\<#is',
'#\>#is',
];
$replace = [
'«',
'»',
];
return preg_replace($search, $replace, $str);
}
Questa è quella proposta da Lei. La puoi riscrivere in questo modo, per allinearla con le parentesi quadre.
/**
* Sostituisce eventuali parentesi angolari in coppia in una stringa con parentesi quadre
* @param string $str : la stringa da controllare
* @return $str con la coppie di parentesi angolari sostituite con parentesi quadre
*/
function gdrcd_angs($str) {
$search = [
'#\<#is',
'#\>#is',
];
$replace = [
'[',
']',
];
return preg_replace($search, $replace, $str);
}
È ovvio che non risolve il problema e che ti lascia le impurità in azione, ma lo trovo un poco più versatile.
Kasa.
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!
World of Tanks ↗
Neverness to Everness ↗
Tiles Survive ↗
The Coven ↗
Crossout ↗
RAID Shadow Legends ↗
Wuthering Waves ↗
AlterEgo ↗
CRSED: F.O.A.D. ↗