【问题标题】:How to choose a substring after given character如何在给定字符后选择子字符串
【发布时间】:2011-10-21 17:40:07
【问题描述】:

除非有不同/更简单的方法,否则我想使用正则表达式将子字符串保存到 javascript 变量中。 例如我有一个这样的链接: http://www.youtube.com/watch?v=sEHN4t29oXY&feature=related

我只想获得 sEHN4t29oXY&feature=related 所以我想我必须检查第一个等号是否出现,然后将该字符串的其余部分保存到变量中。请帮忙,谢谢

【问题讨论】:

  • 是为了简单获取url参数吗?

标签: javascript regex


【解决方案1】:

高效:

variable = variable.substring(variable.indexOf('?v=')+3) // First occurence of ?v=

正则表达式:

variable = variable.replace(/.*\?v=/, '') // Replace last occurrence of ?v= and any characters before it (except \r or \n) with nothing. ? has special meaning, that is why the \ is required
variable = variable.replace(/.*?\?v=/, '') // Variation to replace first occurrence.

【讨论】:

    【解决方案2】:

    像这样:

    var match = /\?v=(.+)/.exec(link)[1];
    

    【讨论】:

      【解决方案3】:

      不使用正则表达式,但也很简单,因为第一个 url 部分是静态的并且有 23 个符号长度

      'http://www.youtube.com/watch?v=sEHN4t29oXY&feature=related'.substr(23)
      

      哦,我搞错了,他想要另一部分,所以实际代码如下:

      'http://www.youtube.com/watch?v=sEHN4t29oXY&feature=related'.substr(31)
      

      【讨论】:

      • 其实比我的解决方案还要高效。只需要与原始 URL 完全匹配的格式。
      【解决方案4】:

      我认为从查询字符串中获取参数的最简单方法是使用以下代码:

      var u = new URI('http://www.youtube.com/watch?v=sEHN4t29oXY&feature=related');
      u.getQuery('v') //sEHN4t29oXY
      u.getQuery('feature') //related
      

      现在,应该有人用这样的评论对我大喊大叫:

      JavaScript 中没有 URI 对象,你不能这样做!!!11one

      而且有人会是对的,所以你去:

      /**
       * URI.js by zzzzBov
       */
      (function (w) {
        "use strict";
        var URI = function (str) {
          if (!this) {
            return new URI(str);
          }
          if (!str) {
            str = window.location.toString();
          }
          var parts, uriRegEx, hostParts;
          //http://labs.apache.org/webarch/uri/rfc/rfc3986.html#regexp
          uriRegEx = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;
          str = str.toString();
          parts = uriRegEx.exec(str);
          this.protocol = parts[1] || '';
          this.host = parts[4] || '';
          this.pathname = parts[5] || '';
          this.search = parts[6] || '';
          this.hash = parts[8] || '';
          //logic to break host into hostname:port
          hostParts = this.host.split(':');
          this.hostname = hostParts[0] || '';
          this.port = hostParts[1] || '';
        };
        URI.prototype = {
          getQuery: function (i) {
            var o;
            o = URI.parseQueryString(this.search);
            return i === undefined ? o : o[i];
          },
          setQuery: function (val) {
            var s;
            s = URI.buildQueryString(val);
            this.search = s.length ? '?' + s : s;
          },
          toString: function () {
            return this.protocol + '//' + this.host + this.pathname + this.search + this.hash;
          }
        };
        URI.parseQueryString = function (str) {
          var obj, vars, i, l, data, rawKey, rawVal, key, val;
          obj = {};
          if (!str) {
            return obj;
          }
          //make sure it's a string
          str = str.toString();
          if (!str.length || str === '?') {
            return obj;
          }
          //remove `?` if it is the first char
          if (str[0] === '?') {
            str = str.substr(1);
          }
          vars = str.split('&');
          for (i = 0, l = vars.length; i < l; i += 1) {
            data = vars[i].split('=');
            rawKey = data[0];
            rawVal = data.length > 1 ? data[1] : '';
            //if there's a key, add a value
            if (rawKey) {
              key = URI.decode(rawKey);
              val = URI.decode(rawVal);
              //check if obj[key] is set
              if (obj.hasOwnProperty(key)) {
                if (typeof obj[key] === 'string') {
                  //if it's a string turn it to an array
                  obj[key] = [ obj[key], val ];
                } else {
                  //it's an array, push
                  obj[key].push(val);
                }
              } else {
                obj[key] = val;
              }
            }
          }
          return obj;
        };
        URI.buildQueryString = function (obj) {
          var arr, key, val, i;
          function build(key, value) {
            var eKey, eValue;
            eKey = URI.encode(key);
            eValue = URI.encode(value);
            if (eValue) {
              arr.push(eKey + '=' + eValue);
            } else {
              arr.push(eKey);
            }
          }
          arr = [];
          for (key in obj) {
            if (obj.hasOwnProperty(key)) {
              val = obj[key];
              //isArray check
              if (Object.prototype.toString.call(val) === '[object Array]') {
                for (i in  val) {
                  if (val.hasOwnProperty(i)) {
                    build(key, val[i]);
                  }
                }
              } else {
                build(key, val);
              }
            }
          }
          return arr.join('&');
        };
        URI.decode = decodeURIComponent;
        URI.encode = encodeURIComponent;
        w.URI = URI;
      }(window));
      

      【讨论】:

        猜你喜欢
        • 2015-05-30
        • 1970-01-01
        • 1970-01-01
        • 2021-06-16
        • 2015-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-30
        相关资源
        最近更新 更多