rafinos Δημοσ. 2 Νοεμβρίου 2014 Δημοσ. 2 Νοεμβρίου 2014 (επεξεργασμένο) Γεια σας παιδιά! Έχω ένα div με κείμενο και θέλω να αποθηκεύσω σε ένα javascript array τις λέξεις του κειμένου διαχωρίσμενες. Ξέρω ότι μπορεί να γίνει με το split() αλλά θέλω να διαχωρίζονται τα σημεία στίξης από τις λέξεις (και να μην αποθηκεύοντια κιόλας). Γνωρίζει κανείς κάποιον τρόπο για αυτό; Επεξ/σία 6 Νοεμβρίου 2014 από rafinos
rafinos Δημοσ. 3 Νοεμβρίου 2014 Μέλος Δημοσ. 3 Νοεμβρίου 2014 Χαχαχαχαχαχα Μάλλον ξέρεις τα μυστικά τις split πολύ καλύτερα από εμένα. Υπάρχει κάποιο regular expressions που να κάνει αυτό που θέλω; Αν ναι μήπως μπορείς να με βοηθήσεις ή να μου εξηγήσεις κάπως γιατί πάντα με μπέρδευαν τα regex; Ή μήπως θα ήταν καλύτερο αρχικά να "εξαφανίσω" τα σημεία στίξης από το όλο string και εν συνεχεία να κάνω το διαχωρισμό;
defacer Δημοσ. 3 Νοεμβρίου 2014 Δημοσ. 3 Νοεμβρίου 2014 Δε νομίζω πως έχει νόημα να τα εξηγήσω γιατί ήδη υπάρχουν περίπου 7 δισεκατομμύρια site που τα εξηγούν. Αυτό π.χ. είναι πολύ καλό, ξεκίνα απο δω: http://www.regular-expressions.info/quickstart.html Επίσης μπορείς πολύ εύκολα να πειραματιστείς στον browser σε διάφορα site, π.χ. αυτό http://refiddle.com/
we_will_rise Δημοσ. 3 Νοεμβρίου 2014 Δημοσ. 3 Νοεμβρίου 2014 Κάνε ένα google search το εξής "js split multiple separators" Παραξενεύομαι που δεν είναι εξίσου απλό όπως στην C# αλλά anyway
rafinos Δημοσ. 3 Νοεμβρίου 2014 Μέλος Δημοσ. 3 Νοεμβρίου 2014 Παιδιά εχαριστώ πολύ για τη βοήθεια σας! Το έκανα με τον εξής τρόπο //Συνάρτηση που δέχεται 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 ξεκινάει με / απλά κάπου το χάνω
alou Δημοσ. 3 Νοεμβρίου 2014 Δημοσ. 3 Νοεμβρίου 2014 Το regex δηλώνεται σαν literal ανάμεσα σε / και / ή με τον constructor, new RegExp("..."), το g στο τέλος είναι greedy selection και κάνει αυτό που λες. Μετά το lowercase, το πρώτο regex αφαιρεί single / double quotes, το δεύτερο αφαιρεί όλους τους ειδικούς χαρακτήρες που βλέπεις ανάμεσα στα [] και το τρίτο αφαιρεί double spaces αν δεν κάνω λάθος. Μένεις με χαρακτήρες και single space και κάνεις split στο space για να πάρεις ένα πίνακα με τις λέξεις.
t(o.ot) Δημοσ. 3 Νοεμβρίου 2014 Δημοσ. 3 Νοεμβρίου 2014 Make it simple: string.split(/\W/g).filter(function(t){ return t != '' });
rafinos Δημοσ. 3 Νοεμβρίου 2014 Μέλος Δημοσ. 3 Νοεμβρίου 2014 (επεξεργασμένο) Make it simple: string.split(/\W/g).filter(function(t){ return t != '' }); Μπορείς να μου εξηγήσεις κιόλας τι ακριβώς κάνει αυτό; Καταλαβαίνω ότι αυτό /\W/g βρίσκει όλους τους χαρακτήρες που δεν είναι γράμματα... Αυτό που δεν καταλαβαίνω είναι τι ακριβώς φιλτράρει η filter Επεξ/σία 3 Νοεμβρίου 2014 από rafinos
alou Δημοσ. 3 Νοεμβρίου 2014 Δημοσ. 3 Νοεμβρίου 2014 Ναι είναιι καλή φάση να ρωτάς πως δουλεύει κάτι και να πετάει κάποιος μια "ψαγμένη" εξυπνάδα χωρίς να το εξηγεί, που είναι και λάθος γιατί πετάει έξω όλους τους ελληνικούς χαρακτήρες (εκτός αν δε σε ενδιαφέρουν). Κάνει split σε οποιοδήποτε χαρακτήρα δεν είναι λατινικός χαρακτήρας ή αριθμός και επιστροφή αυτών που δεν είναι κενά string. Στην περίπτωση αυτή, παράδειγμα, το wh!atever θα γύρναγε σε 2 κομμάτια, [wh, atever]. Το "I won't do this stuff" θα γύρναγε σε 6 κομμάτια και θα έκοβε το won't σε 2 λέξεις. Το "τι να κανω τωρα" θα είναι ένα κενό array. 2
rafinos Δημοσ. 4 Νοεμβρίου 2014 Μέλος Δημοσ. 4 Νοεμβρίου 2014 Ναι είναιι καλή φάση να ρωτάς πως δουλεύει κάτι και να πετάει κάποιος μια "ψαγμένη" εξυπνάδα χωρίς να το εξηγεί, που είναι και λάθος γιατί πετάει έξω όλους τους ελληνικούς χαρακτήρες (εκτός αν δε σε ενδιαφέρουν). Κάνει split σε οποιοδήποτε χαρακτήρα δεν είναι λατινικός χαρακτήρας ή αριθμός και επιστροφή αυτών που δεν είναι κενά string. Στην περίπτωση αυτή, παράδειγμα, το wh!atever θα γύρναγε σε 2 κομμάτια, [wh, atever]. Το "I won't do this stuff" θα γύρναγε σε 6 κομμάτια και θα έκοβε το won't σε 2 λέξεις. Το "τι να κανω τωρα" θα είναι ένα κενό array. Ευχαριστώ πολύ! Οπότε επειδή εγώ χρειάζομαι κυρίως ελληνικά κρατάω τη δική μου λύση
t(o.ot) Δημοσ. 4 Νοεμβρίου 2014 Δημοσ. 4 Νοεμβρίου 2014 Μπορείς να μου εξηγήσεις κιόλας τι ακριβώς κάνει αυτό; Καταλαβαίνω ότι αυτό /\W/g βρίσκει όλους τους χαρακτήρες που δεν είναι γράμματα... Αυτό που δεν καταλαβαίνω είναι τι ακριβώς φιλτράρει η filter Αν έχεις αυτό: "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 != '' }); Περιμένω με αγωνία τη δική σου λύση. 1
alou Δημοσ. 4 Νοεμβρίου 2014 Δημοσ. 4 Νοεμβρίου 2014 Τη λειτουργία ζήτησε να καταλάβει, δε ζήτησε άλλη λύση ούτε ξεκίνησε κανένας διαγωνισμός.
defacer Δημοσ. 4 Νοεμβρίου 2014 Δημοσ. 4 Νοεμβρίου 2014 (επεξεργασμένο) Μπορείς να μου εξηγήσεις κιόλας τι ακριβώς κάνει αυτό; Καταλαβαίνω ότι αυτό /\W/g βρίσκει όλους τους χαρακτήρες που δεν είναι γράμματα... Αυτό που δεν καταλαβαίνω είναι τι ακριβώς φιλτράρει η filter Πας να διαβάσεις το manual για την split αν (κακώς) δεν το έχεις κάνει ήδη. Εκτός των άλλων βλέπεις ότι επιστρέφει πίνακα (με strings αλλά δεν έχει σημασία). Άρα η filter είναι μια function που την καλείς πάνω σε πίνακα, άρα ορίζεται για πίνακες (στη JS αυτό σημαίνει συγκεκριμένα πως μιλάμε για την function Array.prototype.filter). Πας λοιπόν να διαβάσεις το manual για τη filter, όπου εξηγεί τι κάνει και έχει και παράδειγμα. Παίρνεις το παράδειγμα και παίζεις λίγο μαζί του, το συγκρίνεις μ' αυτό που σου προτείναμε εδώ με και χωρίς filter και βλέπεις τι γίνεται. Μετά από αυτό σου μένει κάποια απορία; ΥΓ: Ο τρόπος στον οποίο κατέληξες είναι λίγο πόντιος (δε χρειάζεται να κάνεις τα replace, μπορείς πολύ απλά να του πεις ότι όλα αυτά που αφαιρείς απλά θέλεις να χρησιμοποιηθούν σα διαχωριστικά λέξεων) και επίσης οι regexes έχουν κάτι μικρολαθάκια -- προφανώς ξέφυγαν απ' αυτόν που τις έγραψε. ΥΓ2: Βεβαίως δε χρειάζεται καμία filter, απλά να ξέρεις τα βασικά από regex για να προσθέσεις ένα +: /\W+/g Επεξ/σία 4 Νοεμβρίου 2014 από defacer
t(o.ot) Δημοσ. 4 Νοεμβρίου 2014 Δημοσ. 4 Νοεμβρίου 2014 ΥΓ2: Βεβαίως δε χρειάζεται καμία filter, απλά να ξέρεις τα βασικά από regex για να προσθέσεις ένα +: /\W+/g Σωστός. Τη λειτουργία ζήτησε να καταλάβει, δε ζήτησε άλλη λύση ούτε ξεκίνησε κανένας διαγωνισμός. Ούτε εγώ ξεκίνησα την αντιπαράθεση με ανοησίες περί «εξυπνάδων». Κατά τ'άλλα rtfm -όπως είπε περιφραστικά ο defacer- και ίσως μετά από ελάχιστο διάβασμα να μη σου φαίνονται ούτε ψαγμένες, ούτε εξυπνάδες οι μέθοδοι του manual. Πάμε παρακάτω.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα