Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    dividere una frase su spazio e ritorno accapo

    Ciao, sto cercando di contare le parole inserite in un'area di testo.
    sto usando questo:
    funzione js
    codice:
    function countwords() {
        var formtext=document.theform.text.value;
        formtext=formtext.split(" ");
        document.theform.parole.value= formtext.length;
    }
    HTML
    codice:
    <form method="post" name="theform" action="">
    <table>
    <tr>
    <td>
    <textarea name="text" 
    onkeyup="countwords()" 
    onblur="countwords()" 
    onfocus="countwords()" 
    rows="5" cols="34"></textarea>
    </td>
    </tr>
    <tr>
    <td>Num parole</td>
    </tr>
    <tr>
    <td><input type="text" name="parole" /></td>
    </tr>
    </table>
    </form>
    Fin qui tutto bene se conto i caratteri divisi da uno spazio.
    Ma se nella textarea inserisco un ritorno accapo, mi viene mangiata una parola.
    Es:
    Per questo motivo occorre mangiare.
    mi conta 5 parole

    Ma se scrivo:
    Per questo motivo occorre mangiare.
    Oggi si mangia pasta asciutta.
    mi conta 9 parole anzichè 10

    Non riesco a trovare un modo di dare alla funzione split anche i caratteri di ritorno accapo.
    E' possibile farlo?

    Grazie per l'attenzione

  2. #2
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    prova così

    Codice PHP:
    function countwords() {
        var 
    formtext=document.theform.text.value;
        var 
    righe=formtext.split("\n");
        var 
    somma=0;
        for(
    int i=0;i<righe.length;i++)
        {
                
    parole=righe[i].split(" ");
                
    somma+=parole.length;
        }
        
    document.theform.parole.valuesomma;


  3. #3
    Ciao bstefano79
    Ti ringrazio per il suggerimento. Funziona bene ma ho dovuto fare una piccola modifica.
    codice:
    for(int i=0;i<righe.length;i++)
    Mi da errore ed ho corretto così:
    codice:
    for(i=0;i<righe.length;i++) {
    Poi ho aggiunto anche un altro ciclo per evitare di contare anche sottostringhe vuote o nulla.
    Questo è quel che ho fatto:
    codice:
    function countwords() {
        var formtext=document.theform.text.value;
        var righe=formtext.split("\n");
        var somma=0;
        for(i=0;i<righe.length;i++) {
                var parole=righe[i].split(" ");
                if (righe[i] != "") {
                    for(b=0;b<parole.length;b++) {
                        if (parole[b] != "") {
                            somma++;
                        }
                    }
                }
        }
        document.theform.parole.value= somma; 
    }
    Ho aggiunto un secondo ciclo per verificare la presenza di sottostringhe vuote.
    In questo modo mi da un mumero esatto di parole.
    Per questo motivo occorre mangiare.
    Oggi si mangia pasta asciutta.
    mic das
    mi restituisce 12 parole

    Ora debbo dire che è perfetto.
    Grazie ancora e alla prossima.

  4. #4
    Utente di HTML.it L'avatar di willybit
    Registrato dal
    May 2001
    Messaggi
    4,367
    Ciao,
    puoi anche fare un solo split usando una regular expression che include tutti i tipi di spazi (spazio, ritorno a capo, tab,...)
    codice:
    function countwords() {
    		var formtext = document.theform.text.value;
    		document.theform.parole.value = formtext.split(/\s+/g).length;
    	}

  5. #5
    Perfetto, willybit
    tutto con una unica istruzione. Non osavo chiedere una soluzione simile

    Grazie

  6. #6
    Ciao
    si sa che mangiando vien l'appetito e di questo me ne vergogno.
    E' ottima la regex suggerita da willybit. Ho cercato in giro ma non ho trovato nulla in merito.
    Non è che sia possibile inserire nella regex suggeritami anche il carattere apice ( ' ) che in fin dei conti è il carattere dell'apostrofo? Ho cercato in giro prima di fare la richiesta ma non ho trovato nulla.

    Chiedo ancora scusa se do l'impressione di chi voglia approfittare della vostra disponibilità.

  7. #7
    Utente di HTML.it L'avatar di willybit
    Registrato dal
    May 2001
    Messaggi
    4,367
    ri-Ciao,
    puoi mettere tutti i caratteri per i quali vuoi splittare all'interno delle parentesi quadre.
    Ad esempio per aggiungere "l'apostrofo" oltre che gli "spazzi vuoti":
    codice:
    document.theform.parole.value = formtext.split(/[\s']+/g).length;
    contare le parole splittando sugli spazzi o altri caratteri, secondo me, non è il metodo migliore.
    Pensa ad esempio se ci fossero spazzi all'inizio e alla fine, o se la punteggiatura non venisse spaziata (tipo: "uno,due,tre" verrebbe considerata come una sola parola).
    Potresti usare il metodo match delle stringhe, che come parametro ha sempre una RegExp
    codice:
    var formtext = document.theform.text.value;
    re=/\b[\wàèéìòù@-]+\b/gi
    document.theform.parole.value = re.test(formtext) ? formtext.match(re).length : 0;
    questa RE individua le singole parole.
    \b è un "delimitatore tra parole"
    prima di usare la proprietà .length del metodo .match bisogna verificare se la RE individua qualcosa.
    Saluti

  8. #8
    Ciao willybit
    contare le parole splittando sugli spazzi o altri caratteri, secondo me, non è il metodo migliore.
    Pensa ad esempio se ci fossero spazzi all'inizio e alla fine
    Alla storia degli spazi in realtà ci avevo già pensato (in realtà non avevo pensato agli spazi ad inizio frase perchè non è mia abitudine farlo) ma ai doppi spazi tra le parole, cosa che può capitare per via delle tastiere.
    Per questo motivo, non mi sono accontentato di applicare pappagallescamente il tuo primo suggerimento
    codice:
    document.theform.parole.value = formtext.split(/\s+/g).length;
    Ma usando la tua validissima regex ho prima splittato la frase e poi controllato l'esistenza di eventuali sottostringhe vuote:
    codice:
    var formtext=document.theform.text.value;
    var righe=formtext.split(/\s+/g);
    var somma=0;
    for(i=0;i<righe.length;i++) {
    	if (righe[i] != "") {
    		somma++;
    	}
    }
    document.theform.parole.value= somma;
    Solo alla fine eseguivo la stampa del numero.

    Invece non avevo pensato a quel tipo di punteggiatura.
    Per questo il tuo secondo suggerimento è molto più valido dello split.
    Questa volta però l'ho copiato paro paro.
    Questo perchè non capisco il senso dei caratteri contenuti nella regex che ho lasciato come li hai messi: "wàèéìòù@-".
    Non so se considerarli simboli o caratteri veri

    Ciao e grazie ancora

  9. #9
    Utente di HTML.it L'avatar di willybit
    Registrato dal
    May 2001
    Messaggi
    4,367
    La prima RE individua anche doppi, tripli, multipli spazzi.
    Questa qui
    codice:
    /\s+/g
    vuol dire: 1 o più spazzi vuoti

    l'altra RE invece
    codice:
    /\b[\wàèéìòù@-]+\b/gi
    vuol dire:
    "delimitatore di parole" (\b)
    1 o più caratteri di tipo \w (\w corrisponde a caratteri alfanumerici e underscore, è come scrivere [a-z0-9_]) o le lettere accentate o il trattino
    "delimitatore di parole" (\b)

  10. #10
    Ti ringrazio per le delucidazioni, sono state chiare e ne farò tesoro. Sto cominciando a capire qualcosa.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.