Ανάλυση του querystring

Κώδικας, πληροφορίες, ερωτήσεις και απαντήσεις σχετικές με την JavaScript.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Ανάλυση του querystring

Δημοσίευση από skeftomilos » 31 Ιούλ 2005 16:42

Αν γνωρίζετε λίγη JavaScript θα ξέρετε ήδη το αντικείμενο Location. Με αυτό μπορούμε να μάθουμε τη διεύθυνση (το URL) της τρέχουσας σελίδας. Η πρόσβαση σε αυτό το αντικείμενο γίνεται μέσω της ιδιότητας location του πανταχού παρόντος αντικειμένου window. Για παράδειγμα έστω ότι η σελίδα μας βρίσκεται στην εξής διεύθυνση:
Τότε οι ιδιότητες του αντικειμένου Location θα έχουν τις εξής τιμές:

Κώδικας: Επιλογή όλων

window.location.href     => http://www.foo.gr/products/showproduct.php?id=555&features=yes#download
window.location.host     => www.foo.gr
window.location.pathname => /products/showproduct.php
window.location.protocol => http:
window.location.search   => ?id=555&features=yes
window.location.hash     => #download
Ας σημειωθεί ότι εκτός της window.location.href μπορούμε να πάρουμε την πλήρη διεύθυνση και με την window.document.URL.

Το αντικείμενο Location δημιουργείται αυτόματα από τον browser κι εμείς μπορούμε όποτε θέλουμε να διαβάσουμε ή ακόμα και να αλλάξουμε τις ιδιότητές του, όμως οι πληροφορίες δεν είναι τόσο αναλυτικές όσο θα θέλαμε. Συγκεκριμένα αναφέρομαι στην ιδιότητα search που επιστρέφει αυτό το μέρος του URL που στην ορολογία της ASP είναι γνωστό ως querystring. Η ASP είναι server-side τεχνολογία, και ομολογουμένως τα περιεχόμενα του querystring είναι ζωτικής σημασίας γι αυτήν. Έτσι διαθέτει την ιδιότητα Request.QueryString που δίνει αναλυτικά τα περιεχόμενα του querystring. Στο παραπάνω παράδειγμα θα είχαμε τα εξής:

Κώδικας: Επιλογή όλων

Request.QueryString("id")       => "555"
Request.QueryString("features") => "yes"
Μία άλλη server-side τεχνολογία είναι η PHP, που διαθέτει έναν εξίσου αποτελεσματικό τρόπο για την ανάλυση του querystring:

Κώδικας: Επιλογή όλων

$_GET['id']       => '555'
$_GET['features'] => 'yes'
Οι γνώσεις μου σε PHP είναι πολύ φτωχές οπότε διορθώστε με αν έγραψα κάτι λάθος.

Βλέποντας λοιπόν αυτά μας φαίνεται πραγματικά θλιβερό που δεν έχουμε διαθέσιμο έναν ανάλογο τρόπο ανάλυσης του querystring client-side. Γι αυτό δε φταίει η JavaScript αλλά το ανεπαρκές DOM των browsers. Όπως και νά 'χει καλό θα ήταν να προσπαθήσουμε να μπαλώσουμε αυτή την έλλειψη με λίγο κώδικα JavaScript. Θα προσθέσουμε λοιπόν μία επιπλέον ιδιότητα στο αντικείμενο Location που θα παρέχει αυτή τη λειτουργικότητα. Θα βαφτίσω αυτή την ιδιότητα querystring, αλλά αν προτιμήσετε να την πείτε _GET δεν έχω κανένα πρόβλημα. :) Η JavaScript επιτρέπει ονόματα μεταβλητών που να αρχίζουν με το χαρακτήρα υπογράμμισης. Ας δούμε τώρα τον κώδικα.

Κώδικας: Επιλογή όλων

/* Ρουτίνα κατασκευής του location.querystring */
(function() {
  var o = {}
  var re = /[?&](.+?)=(.*?)(?=&|$)/g
  var match
  while (match = re.exec(window.location.search)) {
    var key = match[1]
    var value = unescape(match[2])
    if (o[key] === undefined) {
      o[key] = [value]
    } else {
      o[key].push(value)
      o[key].hasKeys = true
    }
  }
  for (var p in o) if (o[p].length == 1) o[p] = o[p][0]
  window.location.querystring = o
})()
Αν βάλουμε αυτό τον κώδικα στη σελίδα μας, μπορούμε μετά να χρησιμοποιήσουμε τη νέα ιδιότητα querystring με τον εξής τρόπο:

Κώδικας: Επιλογή όλων

window.location.querystring['id']       => '555'
window.location.querystring['features'] => 'yes'
... ή ακόμα κι έτσι αν προτιμάτε:

Κώδικας: Επιλογή όλων

window.location.querystring.id       => '555'
window.location.querystring.features => 'yes'
Ο δεύτερος τρόπος είναι νόμιμος μόνο στην περίπτωση που τα keys στο querystring έχουν μορφή έγκυρων μεταβλητών JavaScript. Για παράδειγμα το όνομα new-id δεν είναι έγκυρο, και είμαστε υποχρεωμένοι να χρησιμοποιήσουμε τον πρώτο τρόπο.

Στη συνέχεια του άρθρου θα κοιτάξουμε σε βάθος τον κώδικα για να καταλάβουμε πώς λειτουργεί. Αν η εμβάθυνση στις τεχνικές JavaScript δεν είναι προτεραιότητα, μπορείτε με ήσυχη συνείδηση να σταματήσετε κάπου εδώ την ανάγνωση.
:)
_________________________________________________________________

Αυτό που κάνει αμέσως εντύπωση στον κώδικα είναι η αρχή και το τέλος του. Δηλαδή το σώμα του κώδικα βρίσκεται κλεισμένο ανάμεσα σε...

Κώδικας: Επιλογή όλων

(function() {
  ...
})()
Αν αφαιρέσεται αυτές τις δύο γραμμές ο κώδικας θα συνεχίσει να δουλεύει. Κλείνοντας όμως τον κώδικα έτσι αποφεύγουμε την άσκοπη δημιουργία global μεταβλητών που θα "μόλυναν" με την παρουσία τους το global namespace. Αυτή η αμυντική τακτική είναι ίσως περιττή αν απλά σκοπεύουμε να γράψουμε μόνοι μας λίγο κώδικα για τη σελίδα μας, αλλά είναι απαραίτητη σε ένα περιβάλλον ανάπτυξης όπου περισσότεροι από ένας προγραμματιστές γράφουν κώδικα για την ίδια σελίδα. Οι έμπειροι JavaScripters χρησιμοποιούν αυτή την τεχνική σε κάθε ευκαιρία χωρίς δεύτερη σκέψη.

Κώδικας: Επιλογή όλων

var o = {}
Άλλη μία περίεργη εντολή. Αυτό που κάνει είναι να δημιουργεί ένα στοιχειώδες αντικείμενο και να το αποδίδει στη μεταβλητή o. Στο αντικείμενο αυτό θα προσθέσουμε στη συνέχεια ιδιότητες και τελικά θα το αποδώσουμε στην ιδιότητα location.querystring όπως βλέπετε στην τελευταία εντολή της ρουτίνας:

Κώδικας: Επιλογή όλων

window.location.querystring = o
Θα μπορούσαμε να πούμε ότι το όνομα του αντικειμένου αυτού είναι Querystring, αν και πουθενά δεν αναφέρεται έτσι. Ας σημειωθεί ότι η εντολή δημιουργίας του αντικειμένου θα μπορούσε να είναι και η παρακάτω. Είναι εντελώς ισοδύναμη:

Κώδικας: Επιλογή όλων

var o = new Object()

Κώδικας: Επιλογή όλων

var re = /[?&](.+?)=(.*?)(?=&|$)/g
Μία ομολογουμένως τρομακτική στο μάτι εντολή! Αν δεν έχετε ξαναδεί Regular Expressions θα σας μοιάζει με κινέζικα. Οι Regular Expressions είναι ένας υπερ-συμπυκνωμένος τρόπος αναζήτησης σχεδίων (patterns) μέσα σε strings. Η συγκεκριμένη εντοπίζει τμήματα κειμένου της μορφής ?name=value& ή &name=value&. Ο τελικός χαρακτήρας g σημαίνει global και χρησιμεύει για να ψάξουμε εξακολουθητικά το κείμενο στόχος για ζευγάρια name=value. Το κείμενο στόχος δεν είναι άλλο από το window.location.search που περιέχει το τμήμα του URL που μας ενδιαφέρει.

Κώδικας: Επιλογή όλων

var match
while (match = re.exec(location.search)) {
  ...
}
Αυτό το τμήμα κώδικα θα ψάξει εξακολουθητικά το window.location.search για το pattern της Regular Expression, αποδίδοντας κάθε φορά τα ευρήματα στη μεταβλητή match. Εδώ πρέπει να πούμε ότι οι Regular Expressions παράλληλα με την κύρια αναζήτηση καταφέρνουν να συγκρατούν στη μνήμη τους και τα επιμέρους θραύσματα του pattern. Για παράδειγμα ας δούμε τι συμβαίνει στην πρώτη επανάληψη του βρόγχου, όταν το κείμενο στόχος είναι το ?id=555&features=yes του αρχικού παραδείγματος:

Κώδικας: Επιλογή όλων

match[0] => ?id=555&
match[1] => id
match[2] => 555
Με λίγα λόγια η μεταβλητή match περιέχει ένα array. Προφανώς μας ενδιαφέρουν μόνο το δεύτερο και τρίτο στοιχείο.

Κώδικας: Επιλογή όλων

var key = match[1]
var value = unescape(match[2])
Ορίζουμε δύο μεταβλητές για τις τιμές key και value για να κάνουμε πιο ευανάγνωστο τον κώδικα που θα ακολουθήσει. Η δεύτερη τιμή είναι πιθανό να περιέχει escaped χαρακτήρες όπως το κενό, για αυτό χρησιμοποιούμε τη ρουτίνα unescape(). Έτσι αν το querystring ήταν ?size=very%20large θα αποθηκεύαμε στη μεταβλητή value την τιμή "very large". Εδώ που τα λέμε δεν αποκλείεται εντελώς να υπάρχουν escaped χαρακτήρες και στο key, αλλά υποθέτω ότι είστε λογικοί άνθρωποι και δε δίνετε στα στοιχεία φόρμας τέτοια ονόματα:

Κώδικας: Επιλογή όλων

<form>
  <input name="active member">
</form>
Αν πάντως έχετε την παραμικρή αμφιβολία, απλά καλέστε την unescape() και για την τιμή της key.

Κώδικας: Επιλογή όλων

if &#40;o&#91;key&#93; === undefined&#41; &#123;
  o&#91;key&#93; = &#91;value&#93;
&#125; else &#123;
  o&#91;key&#93;.push&#40;value&#41;
  o&#91;key&#93;.hasKeys = true
&#125;
Σε αυτό το τμήμα του κώδικα καλούμαστε να αντιμετωπίσουμε ένα αναπάντεχο πρόβλημα. Τα key που περιέχονται στο querystring μπορεί να μην είναι μοναδικά! Π.χ. το παρακάτω URL είναι και έγκυρο και διόλου απίθανο:
Τι θα κάνουμε λοιπόν σε αυτή την περίπτωση; Απλό, οι ιδιότητες της window.location.querystring θα είναι arrays!

Στην πρώτη γραμμή εξετάζουμε αν το αντικείμενο o περιέχει ήδη ιδιότητα key. Αν όχι τότε η έκφραση o[key] θα επιστρέψει undefined. Ελέγχουμε λοιπόν για την τιμή undefined, και μάλιστα χρησιμοποιούμε τον τελεστή αυστηρής ισότητας ===. Αν χρησιμοποιούσαμε το απλό == θα κινδυνεύαμε με ταύτηση του undefined με το null, κάτι πάντως απίθανο στην περίπτωσή μας. Ας σημειωθεί ότι ακόμα και αυτό δεν είναι γενικά αξιόπιστο, γιατί μπορεί μία ιδιότητα να περιέχει τιμή undefined! Στην περίπτωσή μας αυτό είναι αδύνατο και για αυτό προτίμησα αυτή τη μέθοδο αντί για την ορθότερη:

Κώδικας: Επιλογή όλων

if &#40;key in o&#41; &#123;
...για το λόγο ότι ο τελεστής in εγκαινιάστηκε στην έκδοση 1.4 της JavaScript και άρα δεν είναι διαθέσιμος σε μερικούς παλιούς browsers.

Κώδικας: Επιλογή όλων

o&#91;key&#93; = &#91;value&#93;
Αυτή η ταπεινή γραμμή κώδικα είναι παραπλανητική. Δημιουργεί μεν μία ιδιότητα με όνομα key στο αντικείμενο o, αλλά δεν της αποδίδει τιμή value. Της αποδίδει ένα νέο array, το οποίο περιέχει ως μοναδικό στοιχείο την τιμή value! Ερχόμαστε δηλαδή για δεύτερη φορά σε επαφή με τον συμπυκνωμένο τρόπο γραφής της JavaScript. Όπως μπορούμε με τις αγκύλες {} να δημιουργούμε αντικείμενα, μπορούμε με τα άγκυστρα [] να δημιουργούμε arrays. Μερικά παραδείγματα:

Κώδικας: Επιλογή όλων

var a = &#91;&#93;          // array με 0 στοιχεία
var a = &#91;12&#93;        // array με 1 στοιχείο
var a = &#91;12, 'abc'&#93; // array με 2 στοιχεία
Μια που κάναμε αυτή την παρένθεση με τα arrays, ας δείξουμε και λίγα αντικείμενα:

Κώδικας: Επιλογή όλων

var o = &#123;&#125;                                   // αντικείμενο χωρίς καμία ιδιότητα
var o = &#123;name&#58; 'B.Gates'&#125;                    // αντικείμενο με μία ιδιότητα
var o = &#123;name&#58; 'B.Gates', salary&#58; 500000000&#125; // αντικείμενο με 2 ιδιότητες
Επιστρέφουμε (με κρύα καρδιά!) στη ρουτίνα μας.

Κώδικας: Επιλογή όλων

&#125; else &#123;
o&#91;key&#93;.push&#40;value&#41;
Αν αντίθετα το αντικείμενό μας περιέχει ήδη την ιδιότητα key, αρκεί να προσθέσουμε στο υπαρχον array την value. Χρησιμοποιούμε λοιπόν τη μέθοδο push() που όλα τα arrays διαθέτουν, παρότι γνωρίζουμε πως δεν την υποστηρίζει ο IE5. Θα λύσουμε αυτό το μικροπρόβλημα παρακάτω. Αν πάντως θέλουμε να το λύσουμε εδώ και τώρα, αλλάζουμε τον κώδικα ως εξής:

Κώδικας: Επιλογή όλων

&#125; else &#123;
o&#91;key&#93;&#91;o&#91;key&#93;.length&#93; = value

Κώδικας: Επιλογή όλων

o&#91;key&#93;.hasKeys = true
Εδώ προσθέτουμε μία ιδιότητα hasKeys στο array. Δεν είναι τίποτα το ουσιώδες, μόνο μια μικρή πολυτέλεια που θα αιτιολογήσουμε παρακάτω.

Κώδικας: Επιλογή όλων

for &#40;var p in o&#41; if &#40;o&#91;p&#93;.length == 1&#41; o&#91;p&#93; = o&#91;p&#93;&#91;0&#93;
Η τελευταία εντολή που χρειάζεται να εξηγηθεί είναι αρκετά δυσνόητη, οπότε ας την αποσυμπιέσουμε λίγο για λόγους σαφήνειας:

Κώδικας: Επιλογή όλων

for &#40;var p in o&#41; &#123;
  if &#40;o&#91;p&#93;.length == 1&#41; &#123;
    o&#91;p&#93; = o&#91;p&#93;&#91;0&#93;
  &#125;
&#125;
Αυτό που θέλουμε να πετύχουμε είναι να απαλλαγούμε από όλα τα arrays που περιέχουν μόνο ένα στοιχείο. Η αλήθεια είναι ότι στις περισσότερες περιπτώσεις δεν έχουμε να κάνουμε με πολλαπλές τιμές στο querystring, οπότε είναι κρίμα να πρέπει να γράφουμε συνεχώς [0] για να προσδιορίζουμε το πρώτο στοιχείο του array. Θα διατρέξουμε λοιπόν όλες τις ιδιότητες του αντικειμένου o, και θα αντικαταστήσουμε κάθε array με length = 1 με το πρώτο στοιχείο του. Για να διατρέξουμε τις ιδιότητες ενός αντικειμένου, η JavaScript μας προσφέρει τον κομψό βρόγχο for(property in object).

Ουφ! καλοκαιριάτικα με τι σας βάζω να ασχολείστε! Τέλος πάντων νομίζω ότι τελειώσαμε με αυτή την κουραστική ρουτίνα, ή μάλλον ... όχι ακόμα. Έχουμε ακόμα να δούμε μερικά πράγματα, και καταρχήν πώς θα αξιοποιήσουμε τη δυνατότητα των πολλαπλών τιμών. Έστω λοιπόν πάλι το παρακάτω URL:
Γράφοντας τον κώδικα δε μπορούμε βέβαια να είμαστε σίγουροι εκ των προτέρων για τον αριθμό των κλειδιών id. Μπορεί να είναι ένα, μπορεί και περισσότερα. Ο παρακάτω κώδικας θα εμφανίσει από ένα μήνυμα για κάθε id, όσα κι αν είναι.

Κώδικας: Επιλογή όλων

if &#40;window.location.querystring&#91;'id'&#93;&#41; &#123;
  if &#40;window.location.querystring&#91;'id'&#93;.hasKeys&#41; &#123;
    for &#40;var i = 0; i < window.location.querystring&#91;'id'&#93;.length; i++&#41; &#123;
      alert&#40;window.location.querystring&#91;'id'&#93;&#91;i&#93;&#41;
    &#125;
  &#125; else &#123;
    alert&#40;window.location.querystring&#91;'id'&#93;&#41;
  &#125;
&#125;
Εδώ βλέπετε το λόγο ύπαρξης της ιδιότητας hasKeys. Τη χρησιμοποιούμε για να ξεχωρίσουμε τα arrays από τις απλές τιμές. Θα πείτε, ήταν απαραίτητο; Δεν έχει η JavaScript κάποιο τρόπο για να εντοπίζει τα arrays; Η απάντηση είναι ένα διστακτικό όχι. Τουλάχιστον δε διαθέτει με τον σαφή τρόπο της VBScript (ρουτίνα IsArray) ή της PHP (ρουτίνα is_array). Μπορούμε να χρησιμοποιήσουμε τον τελεστή instanceof (a instanceof Array), αλλά δεν είναι τόσο διαισθητικός και επιπλέον απαιτεί τουλάχιστον JavaScript 1.4. Υπάρχει και ο παρακάτω τρόπος:

Κώδικας: Επιλογή όλων

a.__proto__ == Array.prototype
...αλλά θα συμφωνήσετε ότι είναι τόσο άσχημος που δε βλέπεται! Μπορούμε ωστόσο να τον κλείσουμε σε μία ρουτίνα isArray, και να μπαλώσουμε έτσι άλλη μία έλλειψη της JavaScript:

Κώδικας: Επιλογή όλων

function isArray&#40;a&#41; &#123;
  return &#40;a && a.__proto__ == Array.prototype&#41; ? true &#58; false
&#125;
Αν νομίζουμε ότι αυτός ο τρόπος μας καλύπτει, μπορούμε να αφαιρέσουμε την ιδιότητα hasKeys από τα arrays του querystring, αν και δεν πιάνει τόπο εδώ που τα λέμε.

Αναφέρθηκα παραπάνω στη μέθοδο Array.push() που απουσιάζει από τον IE5. Προσωπικά δε μπορώ να ζήσω χωρίς την push(), και γι αυτό προσθέτω πάντα την παρακάτω γραμμή στην αρχή του κώδικα:

Κώδικας: Επιλογή όλων

if &#40;!Array.prototype.push&#41; &#123; Array.prototype.push = function&#40;x&#41; &#123; this&#91;this.length&#93; = x &#125; &#125;
Προσοχή, πρέπει να βρίσκεται πριν από τη ρουτίνα κατασκευής του querystring.

Να πούμε τέλος ότι δεν είναι απαραίτητο να γράφουμε ξανά και ξανά το μακρινάρι window.location.querystring. Μπορούμε να αφαιρούμε το τμήμα window. γιατί είναι προαιρετικό, ή μπορούμε να αποθηκεύουμε το αντικείμενο σε μία τοπική μεταβλητή:

Κώδικας: Επιλογή όλων

var q = window.location.querystring
if &#40;q&#91;'id'&#93;&#41; &#123;
  if &#40;isArray&#40;q&#91;'id'&#93;&#41;&#41; &#123;
    ...
Εκτός από πιο ευανάγνωστος ο κώδικας θα γίνει και ταχύτερος σε εκτέλεση, καθώς και μικρότερος σε μέγεθος (bytes).

Αυτά τα ολίγα και για σήμερα. :P
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

emphasy
Honorary Member
Δημοσιεύσεις: 4303
Εγγραφή: 16 Ιαν 2005 10:31

Ανάλυση του querystring

Δημοσίευση από emphasy » 31 Ιούλ 2005 18:59

Wow nice, bravo :D

Άβαταρ μέλους
iffor
Δημοσιεύσεις: 778
Εγγραφή: 14 Μάιος 2005 01:19
Τοποθεσία: Παράδεισος
Επικοινωνία:

Ανάλυση του querystring

Δημοσίευση από iffor » 31 Ιούλ 2005 22:49

:D Αυτό είναι...!!! Και η πλάκα είναι ότι έψαχνα σήμερα ένα τρόπο για το πώς θα μπορούσα να βάλω σε ένα string την πλήρη διεύθυνση της τρέχουσας σελίδας...!!!
Προσπαθώ να εξοικειωθώ όσο το δυνατόν περισσότερο με την php και έχω αφήσει την js να περιμένει...
Μπράβο ρε skeftomilos, you save the day...!!!
Προσπαθούσα όλη μέρα να βρώ κάποια αντίστοιχη εντολή στην php για το τράβηγμα του url, αλλά μάταια και τσουπ πετάχτηκες εσύ :D
Αν και δεν ειναι το σωστό μέρος, αλλά σαν θέμα ταιριάζουν, ξέρει κανείς την αντίστοιχη εντολή στην php που να επιστρέφει ότι και η
window.location.href
Είδα τα url functions της php αλλά δεν βρήκα κάτι ίδιο, εκτός και αν έψαχνα εκτός τόπου και χρόνου... :roll:
Βεβαία υπάρχει και το
$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']
αλλα έλεγα μήπως υπήρχε και τίποτα καλύτερο μιας και το παραπάνω επιστρέφει το URL αλλά όχι και απεσταλμένα δεδομένα που αναγράφονται στο URL μετά το ?. Θέλω να πώ ότι αν πάρουμε το παράδειγμα URL του skeftomilou
οι παραπάνω server εντολές θα επιστρέψουν μονο το
Αν ξέρει κανείς ας πει πως μπορούμε μέσω της PHP να το διαβάζουμε όλο το URL, thanx...!!! :D
μια νέα αρχή ξεκίνησε...
ένας καινούριος δρόμος άνοιξε...
redpanda.gr

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Ανάλυση του querystring

Δημοσίευση από skeftomilos » 01 Αύγ 2005 13:55

Δεν ξέρω και πολλά από PHP αλλά τώρα συνειδητοποιώ ότι η ASP δεν έχει απλό τρόπο για να πάρουμε ολόκληρο το URL. Δίνει το αντίστοιχο του window.location.search με την Request.ServerVariables("QUERY_STRING"), αλλά χωρίς το αρχικό ερωτηματικό (?). Πάντως αν δε σου απαντήσουν εδώ θα έλεγα να επαναλάβεις το ερώτημα στο τμήμα της PHP, ώστε να το εξετάσουν στα σίγουρα οι σχετικοί guru! :D
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Ανάλυση του querystring

Δημοσίευση από ThyClub » 01 Αύγ 2005 14:30

PHP:

parse_url


Απο το manual:
This function returns an associative array returning any of the various components of the URL that are present. This includes the

scheme - e.g. http
host
port
user
pass
path
query - after the question mark ?
fragment - after the hashmark #
This function is not meant to validate the given URL, it only breaks it up into the above listed parts. Partial urls are also accepted, parse_url() tries its best to parse them correctly.

Example 996. parse_url() example

Κώδικας: Επιλογή όλων

$ php -r 'print_r&#40; parse_url&#40;"http&#58;//username&#58;password@hostname/path?arg=value#anchor"&#41;&#41;;' 
Array 
&#40; 
   &#91;scheme&#93; => http 
   &#91;host&#93; => hostname 
   &#91;user&#93; => username 
   &#91;pass&#93; => password 
   &#91;path&#93; => /path 
   &#91;query&#93; => arg=value 
   &#91;fragment&#93; => anchor 
&#41; 

$ php -r 'print_r&#40; parse_url&#40;"http&#58;//invalid_host..name/"&#41;&#41;;' 
Array 
&#40; 
   &#91;scheme&#93; => http 
   &#91;host&#93; => invalid_host..name 
   &#91;path&#93; => / 
&#41;

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Ανάλυση του querystring

Δημοσίευση από skeftomilos » 01 Αύγ 2005 15:27

Χρήσιμη η parse_url αλλά νομίζω ότι ο iffor ενδιαφέρεται για το πλήρες URL της τρέχουσας σελίδας, όχι για το πώς θα το τεμαχίσει. :)

BTW άνθρωποι είμαστε και λάθοι κάνουμε οπότε να κάνω μία διόρθωση στο script μου. Απ' ό,τι φαίνεται η συνάρτηση unescape() διορθώνει τα πάντα εκτός από το χαρακτήρα + που συνήθως αντικαθιστά το κενό. Οπότε χρειάζεται να κάνουμε αυτή την αλλαγή μόνοι μας. Ξαναγράφω παρακάτω ολόκληρο το script διορθωμένο.

Κώδικας: Επιλογή όλων

/* Ρουτίνα κατασκευής του window.location.querystring */ 
&#40;function&#40;&#41; &#123;
  var o = &#123;&#125;
  var re = /&#91;?&&#93;&#40;.+?&#41;=&#40;.*?&#41;&#40;?=&|$&#41;/g
  var target = window.location.search.replace&#40;/\+/g, " "&#41;
  var match
  while &#40;match = re.exec&#40;target&#41;&#41; &#123;
    var key = match&#91;1&#93;
    var value = unescape&#40;match&#91;2&#93;&#41;
    if &#40;o&#91;key&#93; === undefined&#41; &#123;
      o&#91;key&#93; = &#91;value&#93;
    &#125; else &#123;
      o&#91;key&#93;.push&#40;value&#41;
      o&#91;key&#93;.hasKeys = true
    &#125;
  &#125;
  for &#40;var p in o&#41; if &#40;o&#91;p&#93;.length == 1&#41; o&#91;p&#93; = o&#91;p&#93;&#91;0&#93;
  window.location.querystring = o
&#125;&#41;&#40;&#41;
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
iffor
Δημοσιεύσεις: 778
Εγγραφή: 14 Μάιος 2005 01:19
Τοποθεσία: Παράδεισος
Επικοινωνία:

Ανάλυση του querystring

Δημοσίευση από iffor » 01 Αύγ 2005 21:01

Yep :D
Δίκιο έχεις skeftomile...!!!
Την γνώριζα την συγκεκριμένη συνάρτηση, αλλά όπως είπες, δεν με ενδιαφέρει ο τεμαχισμός της αλλά εξ ολοκλήρου η σύνθεσή της!
Η parse_url πέρνει ως όρισμα το url, το οποίο στην ουσία αυτό θέλω...!!!
Θα βάλω, όπως είπες, νέο topic στην php μεριά του forum, ώστε να μην γεμίσει με άσχετα θέματα το παρόν!
Πάντος με τα js που έθιξες παραπάνω, με έσωσες...!!!
μια νέα αρχή ξεκίνησε...
ένας καινούριος δρόμος άνοιξε...
redpanda.gr

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Ανάλυση του querystring

Δημοσίευση από skeftomilos » 01 Αύγ 2005 23:24

Απ' ό,τι φαίνεται δεν είμαι ο μόνος που ασχολείται με τα querystring. Μόλις βρήκα ένα πρόσφατο άρθρο που προσεγγίζει το ίδιο πρόβλημα με τον ίδιο σχεδόν τρόπο:

http://adamv.com/dev/javascript/querystring

Δε θέλω να περιαυτολογήσω αλλά το δικό μου script είναι καλύτερο. :P 8)
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Cmg__
Δημοσιεύσεις: 1710
Εγγραφή: 29 Μαρ 2005 22:40

Ανάλυση του querystring

Δημοσίευση από Cmg__ » 07 Αύγ 2005 19:20

Ένα tut-tut το τρενάκι ρε παιδια!

Απάντηση

Επιστροφή στο “JavaScript και Frameworks”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες