Blocchi automatici
Blocchi automatici postato il 23/12/2015 21:37:52 nel forum programmazione, open source e hosting e modificato da gdr-online.com il 24/12/2015 09:51:14
Buonasera a tutti
faccio questo breve post per cercare una soluzione ad un problema che mi attanaglia da un paio di questi giorni.
Ho creato un writer avente queste caratteristiche:
<textarea cols=80 rows=15 maxlength="1000" type=Text Name=Messaggio
value="Messaggio"></textarea>
Quindi una textarea con caratteri massimi 1000. Superati questi 1000 caratteri, l'utente è obbligato a scrivere un (eventuale) pezzo rimanente (quindi un secondo blocco).
Il dubbio mio è il seguente: esiste un qualche-modo che mi permetta di scrivere TUTTO un eventuale post all'interno della textare (mettiamo conto di 1100 caratteri) e poi spezzarmelo automaticamente?
Fare un qualcosa come:
if ($caratteri > 1000) {
due blocchi in cui il primo estrapola i primi 1000 caratteri
e il secondo i rimanenti }
Non so se ho reso bene l'idea ><
Pagine → 1
23/12/2015 21:51:12
Per quello che devi fare le funzioni strlen() http://php.net/manual/en/function.strlen.php ↗ e substr() http://php.net/manual/en/function.substr.php ↗ sono le funzioni che ti possono essere utili per quello che devi fare.
La prima ti permette di contare la lunghezza della stringa ritornandoti il numero di caratteri della stessa (utile per calcolare il numero di blocchi di 1000 caratteri in cui splittare la stringa.
La seconda di estrapolare porzioni di stringa da una stringa base.
La parte più grossa da fare sarà quella di fare il controllo se la stringa non sia spezzata in due nel bel mezzo di una parola ma prima o dopo di questa.
23/12/2015 23:53:44
La cosa piu' comoda è partire dal millesimo carattere, verso il basso e beccare uno spazio.
$haystack = 'Messaggio scritto in chat daql tizio';
$needle = ' ';
$newhaystack = substr($haystack, 0, 1000);
$pos = strripos($newhaystack, $needle);
$first = substr($haystack, 0, $pos);
$last = substr($haystack, $pos + 1);
echo $first.PHP_EOL;
echo $last.PHP_EOL;
24/12/2015 09:40:48 e modificato da longbow il 24/12/2015 09:41:22
mrpanda ha scritto: La cosa piu' comoda è partire dal millesimo carattere, verso il basso e beccare uno spazio.
[...]
Potrebbe essere una soluzione più elegante non solo cercare lo spazio ma trovare la interpunzione forte che termina la frase complessa; così da evitare la tranciatura del blocco di testo e l'eventuale proposizione (principale e/o subordinata) in due paragrafi distinti, donando senso compiuto e proporzione:
prendendo come esempio una stringa con l=1100 cui il carattere 999 è uno spazio, avremmo il risultato 999 + 101 cercando brutalmente lo spazio finale.
prendendo il caso peggiore, norma nello sviluppo, ovvero il caso di l=1001 ci troveremmo nella condizione di avere un blocco da 999 ed un blocco da 2.
tutto questo supponendo che l'utente scriva partendo dalla regola che la punteggiatura debba essere attaccata all'ultima parola e senza spazi interposti.
una ulteriore implementazione potrebbe essere la proporzionalità dei blocchi se l>1000, ovvero il totale del testo inserito in proporzione ai 2000 caratteri: dopo aver trovato il valore centrale, cercare di conseguenza l'interpunzione forte come precedentemente suggerito e dividere i due blocchi così che siano più equilibrati.
saranno sufficienti un paio di cicli e le funzioni più sopra indicate per effettuare la ricerca.
30/12/2015 00:05:41
Sempre che un utente non scriva oltre anche i 2000 caratteri...
A questo punto una soluzione potrebbe essere, laddove abbia scritto piu' di mille caratteri, di fare semplicemente
$blocchi = 1 + floor($lunghezza/1000);
In questo caso:
$lunghezza
0 - 1000, $blocchi = 1
1000 - 1999, $blocchi = 2
2000 - 2999, $blocchi = 3
ecc...
$lunghezzamedia = floor(1000/$blocchi);
In questo modo dividi gli "n" blocchi in gruppi piu o meno uguali di lettere.
Cicli poi la funzione che t'ho passato io, magari implementandola anche col "." se vuoi avere una cosa piu' leggibile (Come suggerivano dopo di me).
Per esempio 2700 caratteri, sono 3 blocchi, $lunghezzamedia = 900 parole...
30/12/2015 01:15:25
Ma.....perchè?
Cioè prima imponi un limite di caratteri e poi costruisci un sistema per aggirarlo in modo automatico?
Ok, l'esercizio di informatica è interessante.
Ma a livello di gameplay è una cosa insensata, ti crei problemi da solo e crei soluzioni complicate per risolvere un problema che potresti semplicemente eliminare alla radice. Rimuovi il limite e basta.
30/12/2015 08:49:49
mrpanda, le tue soluzioni sono molto interessante però avrei un problemino più grande, ovvero la funzione "strripos" che gira solo dal PHP 5 in poi mentre io "lavoro" ancora con l'obsoleto (ma dannatamente comodo) PHP 4 lol
Io in realtà, all'inizio, pensavo di agire con un array tipo:
<?
//es $msg lungo 2030 caratteri
$blocco=array();
$lunghezza=strlen($msg)-1;
//suddivido in blocchi da 1.000
for($k=0; $k < $lunghezza; $k+=1000){
$blocco[]=substr($msg, $k, 1000);
}
var_dump($blocco);//stampo la divisione
/*
situazione teorica
in $blocco[0] i primi 1000 caratteri
in $blocco[1] altri 1000
in $blocco[2] rimanenti
*/
?>
Ma è una soluzione inapplicabile in quanto la tabella dovrebbe avere tanti campi 'testo' quanti sono i gruppi e non posso fare una tabella che si allunghi o accorci in funzione dei gruppi che ho.
@dyrr: in realtà avevo già usato le funzioni da te citate:
$Msg = stripslashes($Msg);
$Msg = substr($Msg, 0, min(strlen($Msg), 1000));
$Msg = addslashes($Msg);
E poi l'inserimento con l'INSERT.
E' proprio la realizzazione della divisione (che dovrebbe avvenire prima) che mi sta mettendo in difficoltà.
30/12/2015 20:11:43
$blocchi = array();
$arrayParole = explode($azione, " ");
$txt = "";
while($parola = array_shift($arrayParole)) {
if (strlen($txt." ".$parola) < 1000) {
$txt .= " ".$parola;
} else {
$blocchi[] = $txt;
$txt = $parola;
}
}
$blocchi[] = $txt;
Piu che altro ti conviene fare tante insert nella tabella delle azioni, quanti sono i blocchi.
Sempre che sia un "eccezione" sforare. Se è lo standard scrivere 2000 caratteri, alza a 2000 il limite.
31/12/2015 09:40:58 e modificato da miagy il 31/12/2015 09:46:14
Posso dire che sono felice di assistere a questo scambio civilissimo di idee e discussione sana?
Era tipo da una vita che non assistivo a questi dibattiti :-D
mrpanda ha scritto:
Piu che altro ti conviene fare tante insert nella tabella delle azioni, quanti sono i blocchi.
Sempre che sia un "eccezione" sforare. Se è lo standard scrivere 2000 caratteri, alza a 2000 il limite.
Questa funzione dovrebbe essere attivata solo per i master-fato per facilitare sia la lettura, in quei casi in cui il fato è piuttosto lungo, e sia la scrittura del master stesso.
Il tutto scritto in questa textarea:
<textarea cols=80 rows=15maxlength="1000" type=Text Name=Messaggio value="Messaggio"></textarea>
E poi letto/inserito così:
$Messaggio = $_POST['Messaggio'];
$Msg = $Messaggio;
$Msg = htmlspecialchars($Msg);
$MySql = "INSERT INTO Chat (Stanza, Mittente, Destinatario, Ora, Testo, Sesso, ImgGilda, DescGilda, ImgRazza, DescRazza, Tipo)";
$MySql .= "VALUES ('".addslashes($Stanza)."', '$pg', '$pg', NOW(), '$Msg', '$Sesso_S', '$ImgGilda', '$DescGilda', '$ImgRazza_S', '$DescRazza_S', 'C')";
mysql_query($MySql);
Mi sto informando sull'inserimento di più INSERT nella tabella delle azioni, quanti sono i blocchi array dato che, lo confesso, è la prima volta che sento una pratica simile.
01/01/2016 19:08:13
mrpanda ha scritto:
$blocchi = array();
$arrayParole = explode($azione, " ");
$txt = "";
while($parola = array_shift($arrayParole)) {
if (strlen($txt." ".$parola) < 1000) {
$txt .= " ".$parola;
} else {
$blocchi[] = $txt;
$txt = $parola;
}
}
$blocchi[] = $txt;
Piu che altro ti conviene fare tante insert nella tabella delle azioni, quanti sono i blocchi.
Sempre che sia un "eccezione" sforare. Se è lo standard scrivere 2000 caratteri, alza a 2000 il limite.
Chiedo scusa per l'UP ma è solo per sicurezza.
Come già detto, è la prima volta che sentivo parlare di più INSERT. Mi sono quindi informato e volevo solo avere una delucidazione.
Quando tu mi consigli di usare tanti insert quanti sono i blocchi, intendi di eseguire una query di questo tipo?
$query = "INSERT INTO Chat VALUES('$blocchi');
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!
Storie di Agarthi ↗
Wuthering Waves ↗
Tibia ↗
War Thunder ↗
Crossout ↗
Exclusive Villa GdR ↗
CRSED: F.O.A.D. ↗
New Orleans ↗