Phân tích cú pháp một URL trong JavaScript


76

Làm cách nào để phân tích cú pháp một URL bằng JavaScript (cũng với jQuery)?

Ví dụ, tôi có cái này trong chuỗi của mình,

url = "http://example.com/form_image_edit.php?img_id=33"

Tôi muốn nhận được giá trị của img_id

Tôi biết tôi có thể làm điều này dễ dàng với PHP parse_url(), nhưng tôi muốn biết làm thế nào nó có thể thực hiện được với JavaScript.


4
Với php bạn không cần phải sử dụng parse_url () chức năng để có được những img_id, chỉ cần sử dụng $ _GET [ 'img_id]
mdaguerre


2
Câu trả lời chính xác dưới đây là hoàn toàn vô lý khi tất cả những gì bạn cần là có window.location.search.split('=')[1]. Tôi không thể tin rằng anh ấy đã nhận được 75 phiếu bầu cho điều đó !!
Adam Spence

3
@AdamSpence window.location chỉ hoạt động với url của trang, không phải là một chuỗi url tùy ý.
Fraser Harris

Câu trả lời:


121

Bạn có thể sử dụng thủ thuật tạo a-element, thêm url vào nó, sau đó sử dụng đối tượng Location của nó .

function parseUrl( url ) {
    var a = document.createElement('a');
    a.href = url;
    return a;
}

parseUrl('http://example.com/form_image_edit.php?img_id=33').search

Cái nào sẽ xuất ra: ?img_id=33


Bạn cũng có thể sử dụng php.js để lấy hàm parse_url trong JavaScript .


Cập nhật (2012-07-05)

Tôi khuyên bạn nên sử dụng thư viện URI.js tuyệt vời nếu bạn cần làm bất cứ điều gì hơn là xử lý URL siêu đơn giản.


4
Tương đương với url.match(/\?.+/)[0], cái nào ngắn hơn và có thể nhanh hơn rất nhiều.
RobG

9
wow, không bao giờ biết về thủ thuật này, nó làm cho tôi ngày sau khi phân loại qua tất cả các thế giới xấu nhất biểu thức thông thường =)
Greg Guida

2
@Christophe Không, nó hiển thị cho bạn những thuộc tính nào có sẵn. Khi bạn gán một url cho thuộc tính href của một phần tử neo, nó sẽ nhận tất cả các thuộc tính của đối tượng Location.
Sindre Sorhus,

1
@SindreSorhus Thật tuyệt vời! Bạn có thể chia sẻ tài liệu tham khảo giải thích nó và hỗ trợ trình duyệt chi tiết không? Điều này cũng đúng với các phần tử có thuộc tính src (liên kết, iframe)?
Christophe

1
window.location.search
Adam Spence

36

Nếu chuỗi của bạn được gọi sthì

var id = s.match(/img_id=([^&]+)/)[1]

sẽ đưa nó cho bạn.


10

Thử cái này:

var url = window.location;
var urlAux = url.split('=');
var img_id = urlAux[1]

Khi sử dụng phương pháp này, làm thế nào tôi có thể tìm thấy bao nhiêu điều này đã được chia thành xin vui lòng?
Tim Marshall,


6

Lót:

location.search.replace('?','').split('&').reduce(function(s,c){var t=c.split('=');s[t[0]]=t[1];return s;},{})

5
Vâng, trong JS, tất cả mọi thứ là một lớp lót: P
Realitätsverlust

5

lấy nó từ google, hãy thử sử dụng phương pháp này

function getQuerystring2(key, default_) 
{ 
    if (default_==null) 
    { 
        default_=""; 
    } 
    var search = unescape(location.search); 
    if (search == "") 
    { 
        return default_; 
    } 
    search = search.substr(1); 
    var params = search.split("&"); 
    for (var i = 0; i < params.length; i++) 
    { 
        var pairs = params[i].split("="); 
        if(pairs[0] == key) 
        { 
            return pairs[1]; 
        } 
    } 


return default_; 
}

2
Điều này sẽ không thành công nếu giá trị của tham số truy vấn chứa '% 3D' ('=') hoặc '% 26' ('&'). Để khắc phục, hãy sử dụng điều này bên trong vòng lặp for: `` `` if (pair.shift () == key) {return pair.join ('='); } `` `` và thực hiện unescape sau khi tách trên '&'.
michielbdejong

3

Điều này sẽ khắc phục một số trường hợp phức tạp trong câu trả lời của kobe:

function getQueryParam(url, key) {
  var queryStartPos = url.indexOf('?');
  if (queryStartPos === -1) {
    return;
  }
  var params = url.substring(queryStartPos + 1).split('&');
  for (var i = 0; i < params.length; i++) {
    var pairs = params[i].split('=');
    if (decodeURIComponent(pairs.shift()) == key) {
      return decodeURIComponent(pairs.join('='));
    }
  }
}

getQueryParam('http://example.com/form_image_edit.php?img_id=33', 'img_id');
// outputs "33"

2

Tôi đã viết một thư viện phân tích cú pháp url javascript, URL.js , bạn có thể sử dụng nó cho việc này.

Thí dụ:

url.parse("http://mysite.com/form_image_edit.php?img_id=33").get.img_id === "33"

Không, tôi chưa bao giờ nghe nói về berfore purl.js.
Kevin Cox

Câu trả lời ở trên của bạn. Mã của bạn nhanh hơn 28 lần và sạch hơn nhiều so với kim tuyến, nhưng tôi không thể sử dụng nó ở trạng thái hiện tại. Tôi đã tạo một vấn đề trên github để bạn xem xét. Cảm ơn bạn
Steven Vachon

2
Bạn chỉ đang quên chạy bước xây dựng. Tuy nhiên phiên bản mới không đòi hỏi các bước xây dựng nữa do đó không cần phải lo lắng về nó bây giờ: D
Kevin Cox

2

Một cái gì đó như thế này sẽ làm việc cho bạn. Ngay cả khi có nhiều giá trị chuỗi truy vấn thì hàm này sẽ trả về giá trị của khóa mong muốn của bạn.

function getQSValue(url) 
{
    key = 'img_id';
    query_string = url.split('?');
    string_values = query_string[1].split('&');
    for(i=0;  i < string_values.length; i++)
    {
        if( string_values[i].match(key))
            req_value = string_values[i].split('=');    
    }
    return req_value[1];
}


1
function parse_url(str, component) {
  //       discuss at: http://phpjs.org/functions/parse_url/
  //      original by: Steven Levithan (http://blog.stevenlevithan.com)
  // reimplemented by: Brett Zamir (http://brett-zamir.me)
  //         input by: Lorenzo Pisani
  //         input by: Tony
  //      improved by: Brett Zamir (http://brett-zamir.me)
  //             note: original by http://stevenlevithan.com/demo/parseuri/js/assets/parseuri.js
  //             note: blog post at http://blog.stevenlevithan.com/archives/parseuri
  //             note: demo at http://stevenlevithan.com/demo/parseuri/js/assets/parseuri.js
  //             note: Does not replace invalid characters with '_' as in PHP, nor does it return false with
  //             note: a seriously malformed URL.
  //             note: Besides function name, is essentially the same as parseUri as well as our allowing
  //             note: an extra slash after the scheme/protocol (to allow file:/// as in PHP)
  //        example 1: parse_url('http://username:password@hostname/path?arg=value#anchor');
  //        returns 1: {scheme: 'http', host: 'hostname', user: 'username', pass: 'password', path: '/path', query: 'arg=value', fragment: 'anchor'}

  var query, key = ['source', 'scheme', 'authority', 'userInfo', 'user', 'pass', 'host', 'port',
      'relative', 'path', 'directory', 'file', 'query', 'fragment'
    ],
    ini = (this.php_js && this.php_js.ini) || {},
    mode = (ini['phpjs.parse_url.mode'] &&
      ini['phpjs.parse_url.mode'].local_value) || 'php',
    parser = {
      php: /^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
      strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
      loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // Added one optional slash to post-scheme to catch file:/// (should restrict this)
    };

  var m = parser[mode].exec(str),
    uri = {},
    i = 14;
  while (i--) {
    if (m[i]) {
      uri[key[i]] = m[i];
    }
  }

  if (component) {
    return uri[component.replace('PHP_URL_', '')
      .toLowerCase()];
  }
  if (mode !== 'php') {
    var name = (ini['phpjs.parse_url.queryKey'] &&
      ini['phpjs.parse_url.queryKey'].local_value) || 'queryKey';
    parser = /(?:^|&)([^&=]*)=?([^&]*)/g;
    uri[name] = {};
    query = uri[key[12]] || '';
    query.replace(parser, function($0, $1, $2) {
      if ($1) {
        uri[name][$1] = $2;
      }
    });
  }
  delete uri.source;
  return uri;
}

tài liệu tham khảo


1
var url = window.location;
var urlAux = url.split('=');
var img_id = urlAux[1]

Đã làm cho tôi. Nhưng var đầu tiên phải là var url = window.location.href


0

Web worker cung cấp URL utils để phân tích cú pháp url.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.