Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Γεια σας παιδιά!

 

Έχω ένα div με κείμενο και θέλω να αποθηκεύσω σε ένα javascript array τις λέξεις του κειμένου διαχωρίσμενες.

Ξέρω ότι μπορεί να γίνει με το split() αλλά θέλω να διαχωρίζονται τα σημεία στίξης από τις λέξεις (και να μην αποθηκεύοντια κιόλας).

 

Γνωρίζει κανείς κάποιον τρόπο για αυτό;

Επεξ/σία από rafinos
Δημοσ.

Χαχαχαχαχαχα

Μάλλον ξέρεις τα μυστικά τις split πολύ καλύτερα από εμένα.

Υπάρχει κάποιο regular expressions που να κάνει αυτό που θέλω;

Αν ναι μήπως μπορείς να με βοηθήσεις ή να μου εξηγήσεις κάπως γιατί πάντα με μπέρδευαν τα regex; :P

 

Ή μήπως θα ήταν καλύτερο αρχικά να "εξαφανίσω" τα σημεία στίξης από το όλο string και εν συνεχεία να κάνω το διαχωρισμό;

Δημοσ.

Δε νομίζω πως έχει νόημα να τα εξηγήσω γιατί ήδη υπάρχουν περίπου 7 δισεκατομμύρια site που τα εξηγούν. Αυτό π.χ. είναι πολύ καλό, ξεκίνα απο δω:

 

http://www.regular-expressions.info/quickstart.html

 

Επίσης μπορείς πολύ εύκολα να πειραματιστείς στον browser σε διάφορα site, π.χ. αυτό

 

http://refiddle.com/

Δημοσ.

Παιδιά εχαριστώ πολύ για τη βοήθεια σας!

 

Το έκανα με τον εξής τρόπο

//Συνάρτηση που δέχεται html και επιστρέφει το κείμενο χωρίς τα html tags
function strip(html){
	var tmp = document.createElement("DIV");
	tmp.innerHTML = html;
	return tmp.textContent || tmp.innerText;
}

//Συνάρτηση που διαγράφει τα σημεία στίξης από το κείμενο, μετατρέπει όλα τα κεφαλαία σε μικρά και διαχωρίζει το κείμενο σε πολλά strings (ένα για κάθε λέξη)
function text_split(div_name){
	var str = strip(document.getElementById(''+div_name).innerHTML);
	str = str.toLowerCase();
	str = str.replace(/["']/g, "")
	str = str.replace(/[\.,-\/#!$%\^&\*;:{}=\-_`"~()@]/g,"");
	str = str.replace(/\s{2,}/g," ");
	str = str.split(" ");
	return str;
}

To θέμα είναι ότι δεν κατανοώ πλήρως τον κώδικα τω τριών .replace (μιας που το βρήκα έτοιμο απλά πρόσθεσα στο δεύτερο τον χαρακτήρα @).

Καταλαβαίνω ας πούμε ότι το /g είναι για να συνεχίζει να ψάχνει και να μην σταματάει μόλις βρει τον πρώτο χαρακτήρα...

Επίσης ότι το regex ξεκινάει με / απλά κάπου το χάνω :P

Δημοσ.

Το regex δηλώνεται σαν literal ανάμεσα σε / και /  ή με τον constructor, new RegExp("..."), το g στο τέλος είναι greedy selection και κάνει αυτό που λες.

 

Μετά το lowercase, το πρώτο regex αφαιρεί single / double quotes, το δεύτερο αφαιρεί όλους τους ειδικούς χαρακτήρες που βλέπεις ανάμεσα στα [] και το τρίτο αφαιρεί double spaces αν δεν κάνω λάθος.

 

Μένεις με χαρακτήρες και single space και κάνεις split στο space για να πάρεις ένα πίνακα με τις λέξεις.

Δημοσ. (επεξεργασμένο)

Make it simple:

string.split(/\W/g).filter(function(t){ return t != '' });

Μπορείς να μου εξηγήσεις κιόλας τι ακριβώς κάνει αυτό;

 

Καταλαβαίνω ότι αυτό /\W/g βρίσκει όλους τους χαρακτήρες που δεν είναι γράμματα...

Αυτό που δεν καταλαβαίνω είναι τι ακριβώς φιλτράρει η filter :P

Επεξ/σία από rafinos
Δημοσ.

Ναι είναιι καλή φάση να ρωτάς πως δουλεύει κάτι και να πετάει κάποιος μια "ψαγμένη" εξυπνάδα χωρίς να το εξηγεί, που είναι και λάθος γιατί πετάει έξω όλους τους ελληνικούς χαρακτήρες (εκτός αν δε σε ενδιαφέρουν).

 

Κάνει split σε οποιοδήποτε χαρακτήρα δεν είναι λατινικός χαρακτήρας ή αριθμός και επιστροφή αυτών που δεν είναι κενά string. Στην περίπτωση αυτή, παράδειγμα, το wh!atever θα γύρναγε σε 2 κομμάτια, [wh, atever]. Το "I won't do this stuff" θα γύρναγε σε 6 κομμάτια και θα έκοβε το won't σε 2 λέξεις. Το "τι να κανω τωρα" θα είναι ένα κενό array.

  • Like 2
Δημοσ.

Ναι είναιι καλή φάση να ρωτάς πως δουλεύει κάτι και να πετάει κάποιος μια "ψαγμένη" εξυπνάδα χωρίς να το εξηγεί, που είναι και λάθος γιατί πετάει έξω όλους τους ελληνικούς χαρακτήρες (εκτός αν δε σε ενδιαφέρουν).

 

Κάνει split σε οποιοδήποτε χαρακτήρα δεν είναι λατινικός χαρακτήρας ή αριθμός και επιστροφή αυτών που δεν είναι κενά string. Στην περίπτωση αυτή, παράδειγμα, το wh!atever θα γύρναγε σε 2 κομμάτια, [wh, atever]. Το "I won't do this stuff" θα γύρναγε σε 6 κομμάτια και θα έκοβε το won't σε 2 λέξεις. Το "τι να κανω τωρα" θα είναι ένα κενό array.

Ευχαριστώ πολύ!

Οπότε επειδή εγώ χρειάζομαι κυρίως ελληνικά κρατάω τη δική μου λύση :)

Δημοσ.

Μπορείς να μου εξηγήσεις κιόλας τι ακριβώς κάνει αυτό;

 

Καταλαβαίνω ότι αυτό /\W/g βρίσκει όλους τους χαρακτήρες που δεν είναι γράμματα...

Αυτό που δεν καταλαβαίνω είναι τι ακριβώς φιλτράρει η filter :P

 

Αν έχεις αυτό: "Foo. Bar... Baz!", χωρίς τη filter θα σου βάλει στο παραγόμενο array μερικά κενά items. Η filter θα τα διώξει αυτά.

 

 

Ναι είναιι καλή φάση να ρωτάς πως δουλεύει κάτι και να πετάει κάποιος μια "ψαγμένη" εξυπνάδα χωρίς να το εξηγεί, που είναι και λάθος γιατί πετάει έξω όλους τους ελληνικούς χαρακτήρες (εκτός αν δε σε ενδιαφέρουν).

 

Κάνει split σε οποιοδήποτε χαρακτήρα δεν είναι λατινικός χαρακτήρας ή αριθμός και επιστροφή αυτών που δεν είναι κενά string. Στην περίπτωση αυτή, παράδειγμα, το wh!atever θα γύρναγε σε 2 κομμάτια, [wh, atever]. Το "I won't do this stuff" θα γύρναγε σε 6 κομμάτια και θα έκοβε το won't σε 2 λέξεις. Το "τι να κανω τωρα" θα είναι ένα κενό array.

 

Ούτε «ψαγμένο» είναι, ούτε «εξυπνάδα». Για να μην πετάξει έξω τα ελληνικά, string.split(/[\wα-ζΑ-ΖάέήίόώϊΐΆΈΉΊΌΏΪ]/g).filter(function(t){ return t != '' });

 

Περιμένω με αγωνία τη δική σου λύση.

  • Like 1
Δημοσ. (επεξεργασμένο)

Μπορείς να μου εξηγήσεις κιόλας τι ακριβώς κάνει αυτό;

 

Καταλαβαίνω ότι αυτό /\W/g βρίσκει όλους τους χαρακτήρες που δεν είναι γράμματα...

Αυτό που δεν καταλαβαίνω είναι τι ακριβώς φιλτράρει η filter :P

 

Πας να διαβάσεις το manual για την split αν (κακώς) δεν το έχεις κάνει ήδη. Εκτός των άλλων βλέπεις ότι επιστρέφει πίνακα (με strings αλλά δεν έχει σημασία). Άρα η filter είναι μια function που την καλείς πάνω σε πίνακα, άρα ορίζεται για πίνακες (στη JS αυτό σημαίνει συγκεκριμένα πως μιλάμε για την function Array.prototype.filter).

 

Πας λοιπόν να διαβάσεις το manual για τη filter, όπου εξηγεί τι κάνει και έχει και παράδειγμα. Παίρνεις το παράδειγμα και παίζεις λίγο μαζί του, το συγκρίνεις μ' αυτό που σου προτείναμε εδώ με και χωρίς filter και βλέπεις τι γίνεται.

 

Μετά από αυτό σου μένει κάποια απορία;

 

ΥΓ: Ο τρόπος στον οποίο κατέληξες είναι λίγο πόντιος (δε χρειάζεται να κάνεις τα replace, μπορείς πολύ απλά να του πεις ότι όλα αυτά που αφαιρείς απλά θέλεις να χρησιμοποιηθούν σα διαχωριστικά λέξεων) και επίσης οι regexes έχουν κάτι μικρολαθάκια -- προφανώς ξέφυγαν απ' αυτόν που τις έγραψε.

 

ΥΓ2: Βεβαίως δε χρειάζεται καμία filter, απλά να ξέρεις τα βασικά από regex για να προσθέσεις ένα +: /\W+/g 

Επεξ/σία από defacer
Δημοσ.

ΥΓ2: Βεβαίως δε χρειάζεται καμία filter, απλά να ξέρεις τα βασικά από regex για να προσθέσεις ένα +: /\W+/g 

 

Σωστός.

 

Τη λειτουργία ζήτησε να καταλάβει, δε ζήτησε άλλη λύση ούτε ξεκίνησε κανένας διαγωνισμός.

 

Ούτε εγώ ξεκίνησα την αντιπαράθεση με ανοησίες περί «εξυπνάδων». Κατά τ'άλλα rtfm -όπως είπε περιφραστικά ο defacer- και ίσως μετά από ελάχιστο διάβασμα να μη σου φαίνονται ούτε ψαγμένες, ούτε εξυπνάδες οι μέθοδοι του manual. Πάμε παρακάτω.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...