Visualizzazione risultati 1 fino 16 di 16

Discussione: controllo lunghezza parole e troncarle

  1. #1
    Guest

    Predefinito controllo lunghezza parole e troncarle

    ok, sn tornato alla carica (di richieste), inizio con una, prendo dei dati da db, diciamo delle frasi, splitto in parole e controllo che non siano più lunghe di tot caratteri, se lo sono le tronco, detto qst io faccio così

    Codice PHP:
    //$msg viene impostato poco + su, ma nn è rilevante in qst contesto, sappiate solo ke esiste ed è una stringa di testo :-)
    if(substr($msg, 0, 1) != '§'){

    $msg = explode(' ', $msg);
    $con = count($msg);
    $mlp = '15'; //Massima Lunghezza Parole
    foreach($msg as $par){
    $par = $msg;
    if (
    strlen($par) > $mlp)
    $par = substr($par, 0, $mlp);
    }
    $msg = implode(' ', $par);
    ma non va tanto bene, mi da $msg vuoto...
    consigli? rimproveri? qualunque cosa

    ciao!

  2. #2
    Guest

    Predefinito

    xke dopo il foreach la variabile $par la risetti inserendoci tutto il messaggio??

    ciao ^__^

  3. #3
    Guest

    Predefinito

    provo a nn risettarla e ti facciosapere, cmq la risettavo perkè nn andava, qll è rimasto lì dopo un test ;)

    EDIT
    provato a togliere la ridichiarazione ma niente proprio...
    al momento sto girando senza qusta piccola routine ma appena c'è una parola troppo lunga (e sn frequenti) si incasina leggermente il layout

    notte, a domani!
    Ultima modifica di SFo : 03-02-2006 alle ore 00.11.30

  4. #4
    Guest

    Predefinito

    e usare wordwrap() ?

    cmq c'è un errore di fondo... del tipo che tronchi una parola ad un tot di caratteri, ma perdi i restanti . es: supercalifragilistic (troncata)
    Codice PHP:
    substr($par, 0, $mlp)
    Ultima modifica di Inverno : 04-02-2006 alle ore 01.36.13

  5. #5
    Guest

    Predefinito

    Perché fai un explode con gli spazi (ma non bisogna inserire lo spazio con l'escape?) di $msg? In questo modo, $msg diventa un array, in teoria...

    Quindi dovresti accederci lettera per lettera $msg[0] e cosi' via, e casomai contare la dimensione dell'array

    Usa count() senza explodare $msg

  6. #6
    Ospite Guest

    Predefinito

    Citazione Originalmente inviato da jostock
    xke dopo il foreach la variabile $par la risetti inserendoci tutto il messaggio??

    ciao ^__^
    mi associo...che senso ha?

  7. #7
    Guest

    Predefinito

    Citazione Originalmente inviato da pietrovischia
    Perché fai un explode con gli spazi (ma non bisogna inserire lo spazio con l'escape?) di $msg? In questo modo, $msg diventa un array, in teoria...
    anche in pratica ....
    perchè l'escape? non è una regex (a dire il vero neanche nella regex si usa l'escape con gli spazi)

    Quindi dovresti accederci lettera per lettera $msg[0] e cosi' via, e casomai contare la dimensione dell'array
    non lettera per lettera, ma parola per parola... cioè quello che voleva lui

  8. #8
    Guest

    Predefinito

    ora guardo per il wordwrap, poi lo so che diventa un array e sono passato anche per un ciclo del tipo
    Codice PHP:
    $msg = explode(' ', $msg);
    $con = count($msg);
    $mlp = '15'; //Massima Lunghezza Parole
    for($i=0; $i<$con; $i++){
    $par = $msg[$i];
    if (
    strlen($par) > $mlp)
    $par = substr($par, 0, $mlp);
    }
    $msg = implode(' ', $par);
    ma nada, faccio un salto su php.net/wordwrap
    ciao!

    EDIT:
    ho guardato wordwrap, non mi è utile in questo contesto in quanto non mi interessa che una riga abbia tot caratteri ma che una PAROLA non abbia tot caratteri, sob
    Ultima modifica di SFo : 04-02-2006 alle ore 17.21.26

  9. #9
    Guest

    Predefinito

    Citazione Originalmente inviato da SFo
    ora guardo per il wordwrap, poi lo so che diventa un array e sono passato anche per un ciclo del tipo
    Codice PHP:
    $msg = explode(' ', $msg);
    $con = count($msg);
    $mlp = '15'; //Massima Lunghezza Parole
    for($i=0; $i<$con; $i++){
    $par = $msg[$i];
    if (
    strlen($par) > $mlp)
    $par = substr($par, 0, $mlp);
    }
    $msg = implode(' ', $par);
    Sì ok, ma hai provato a non usare quell'inutile explode? fai solo $con = count($msg), SENZA passare per $msg = explode('',$msg)

  10. #10
    Guest

    Predefinito

    Citazione Originalmente inviato da pietrovischia
    Sì ok, ma hai provato a non usare quell'inutile explode? fai solo $con = count($msg), SENZA passare per $msg = explode('',$msg)
    forse ancora nn hai capito bene il problema...
    a lui serve trovare la lunghezza di ogni singola parola...

    ciao ^__^

  11. #11
    L'avatar di heracleum
    heracleum non è connesso Utente storico
    Data registrazione
    21-01-2004
    Messaggi
    3,333

    Predefinito

    Meno male, almeno questo l'avevo già scritto per me, quindi lo rigiro qui senza fatica:
    Codice PHP:
    $msgtokens = explode(" ", $msg);
    $tokenlen = 0;
    $maxlentoken = 50;
    $cnt = count($msgtokens);
    for (
    $ij=0; $ij<$cnt; $ij++){
    if(
    strlen($msgtokens[$ij]) > $maxlentoken){
    $tokenlen = strlen($msgtokens[$ij]);
    $tmptoken = '';
    for (
    $ijk=0; $ijk<$tokenlen; $ijk+=$maxlentoken){
    $tmptoken .= substr($msgtokens[$ij], $ijk, $maxlentoken) ." ... ";
    }
    $msgtokens[$ij] = $tmptoken;
    }
    }
    $msg = implode(" ", $msgtokens);
    Per comprendere meglio, il termine "Token" si usa comunemente quando c'è qualcosa da spezzettare e analizzare singolarmente. In questo caso è una parola, ma anche no (se uno scrive ' --- ' non è di certo una parola, quindi il termine Token va sempre bene). Addirittura in Java l'explode vari li fa una classe che appunto si chiama Tokenizer.
    Tornando al php, dovrebbe appunto funzionare, visto che è quasi preso e incollato da un mio script funzionante, ho solo cambiato un paio di nomi di variabili, appunto per spezzettare i paroloni troppo lunghi o eventuali lamerate tipo infiniti "!!!!!!!!!!!!!!!!!!!....".
    Avvertimento: richiedere in privato questioni tecniche produrrà inevitabilmente una supercazzola prematurata come risposta. (5 served)

  12. #12
    Guest

    Predefinito

    Citazione Originalmente inviato da SFo
    ho guardato wordwrap, non mi è utile in questo contesto in quanto non mi interessa che una riga abbia tot caratteri ma che una PAROLA non abbia tot caratteri, sob
    forse non hai capito o mi sono spiegato male, intendevo usare il wordwrap dentro il ciclo foreach (al posto di substr insomma), per via del bug che ti avevo scritto

    potresti provare anche con una regex, ma non sò in termini di performance quanto sia conveniente

    Codice PHP:
    $testo = preg_replace( "~([^\s<>'\"/\.\\-\?&\n\r\%]{75})~i", " \\1<br />", $testo);

  13. #13
    Guest

    Predefinito

    ho risolto!
    mi sa ke dimenticavo un $i da qualche parte ma ora funge
    Codice PHP:
    $par = explode(' ', $msg);
    $par_count = count($par);
    for(
    $i=0; $i<$par_count; $i++){
    if(
    strlen($par[$i]) > $mlp){
    $par[$i] = substr($par[$i], 0, $mlp);
    }
    }
    $msg = implode(' ', $par);
    grazie a tutti della disponibilità e scusate se vi ho rotto le @@ e rubato tempo
    ciao!

    ps: per studiarmi i cicli for mi sono fatto uno script che preso un elenco m3u con un ciclo for controlli che la prima lettera della riga nn sia un #, in tal caso copia il file sul lettore mp3, altrimenti va oltre
    riciao!

  14. #14
    Guest

    Predefinito

    WHOOOOOPS chiedo immensamente scusa, avevo equivocato completamente ^_^

    Grazie a Jostock per avermi fatto notare l'equivoco!

  15. #15
    L'avatar di heracleum
    heracleum non è connesso Utente storico
    Data registrazione
    21-01-2004
    Messaggi
    3,333

    Predefinito

    Citazione Originalmente inviato da SFo
    ho risolto!
    Non esattamente.

    Vedo che il mio codice non se l'è filato nessuno, bene

    Ma come dicevo, ho dovuto scrivermi questo script per i miei commenti sul sito, per evitare che si potessero scrivere pezzi interminabili (senza spazi) e spezzettarli (PIU' VOLTE, non solo una).
    E in effetti non è stato proprio un attimo, perché c'è da considerare un particolare che è stato affrontato nel mio codice (che ho testato bene) ma nel tuo non l'hai considerato:
    una "parola" (un pezzo tra spazi) potrebbe essere non solo quasi il DOPPIO più lungo della lunghezza massima ma DIECI, VENTI volte la lunghezza massima (mai confidare nel buonsenso di chi scrive )
    Quindi ci dev'essere un loop anche interno per vedere QUANTE volte deve essere spezzettato, o meglio quante volte supera la lunghezza massima anche se è già stato ridotto dal loop precedente.

    Il codice che lo implementa sta nel mio post precedente.
    Avvertimento: richiedere in privato questioni tecniche produrrà inevitabilmente una supercazzola prematurata come risposta. (5 served)

  16. #16
    Guest

    Predefinito

    grazie mille heracleum, ti ruberò un ciclo allora, sperando non sia quello mestruale, non avrei il tempo per sorbirmi anche quello
    e cmq essendo io CONTRO gli spammoni, i rompi($quello_che_fa_rima_con_spammoni) etc etc non mi interessa spezzettargli la parola ma troncarla proprio
    grazie ancora a tutti, ciao!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •