【问题标题】:Find base name in URL in Javascript在 Javascript 中的 URL 中查找基本名称
【发布时间】:2010-01-02 13:34:25
【问题描述】:

我想从 Javascript 中的图像 URL 中提取基本名称。有人愿意帮我处理正则表达式吗?

规则是:

  • 返回最后一个/左边最后一个.左边的所有内容

    www.domain.com/images/image.hires.jpg

  • 如果没有找到.,则返回完整的基本名称 www.domain.com/images/image_hi_res

我有一个笨拙的/\/[^.]+\.[^.]+$/,但不知道如何将/. 设为可选以及如何仅寻找最后一个.

一如既往地为所有出色的输入干杯。我选择了一个开箱即用的正则表达式。

【问题讨论】:

标签: javascript regex


【解决方案1】:

另一个解决方案:

url.replace(/^.*\/|\.[^.]*$/g, '')

【讨论】:

  • @themis 仅适用于新 tlds
【解决方案2】:

在这种情况下,我实际上不会使用正则表达式,而只是使用lastIndexOfsubstring。类似的东西

function findBaseName(url) {
    var fileName = url.substring(url.lastIndexOf('/') + 1);
    var dot = fileName.lastIndexOf('.');
    return dot == -1 ? fileName : fileName.substring(0, dot);
}

【讨论】:

  • 如果你想要当前的 url,只需像这样使用上面的函数:findBaseName(window.location.href);
【解决方案3】:

试试这个正则表达式:

/([^/]+(?=\.[^/.]*$)|[^/.]+$)/

【讨论】:

    【解决方案4】:

    在您的示例中,假设输入字符串是整个 URL,仅此而已,我已经成功了

    /\/[^\/]+(?=\.[^.]+$)|\/[^\/]+$/
    

    这首先尝试匹配从最后一个/ 到最后一个. 的所有内容;如果没有点,它将尝试匹配从最后一个/ 到字符串末尾的所有内容。

    前导 / 包含在匹配中(JavaScript 不支持后视,否则我可以使用它),因此您需要删除匹配的第一个字符。

    【讨论】:

      【解决方案5】:

      当您可以访问 DOM 时,可以使用 <a> 标签的原生 HTMLHyperlinkElementUtils 属性:

      function urlInfo (url) {
      
        var props = 'hash host hostname href origin password pathname port protocol username search';
      
        if (!window.urlInfoAnchorElement)
          window.urlInfoAnchorElement = document.createElement('a');
      
        urlInfoAnchorElement.href = url;
      
        return props.split(' ').reduce(function (m, v, i) {
          m[v] = urlInfoAnchorElement[v]; return m;
        }, {});
      
      }
      
      // Example:
      urlInfo('http://localhost:4000/guidelines/7yQxvndK?get=sup&love=1#oiwjef');
      
      /* => {
        hash: "#oiwjef"
        host: "localhost:4000"
        hostname: "localhost"
        href: "http://localhost:4000/guidelines/7yQxvndK?get=sup&love=1#oiwjef"
        origin: "http://localhost:4000"
        password: ""
        pathname: "/guidelines/7yQxvndK"
        port: "4000"
        protocol: "http:"
        search: "?get=sup&love=1"
      } */
      

      【讨论】:

        【解决方案6】:

        我推荐使用 FileSystemObject activex。当然,您需要在注册表中将其标记为安全才能在没有唠叨屏幕的情况下执行它,但它非常有用。你的电话... GetBaseName 函数做你想做的事。

        【讨论】:

        • 这消除了跨平台和跨浏览器的兼容性,但收益相对较小。
        猜你喜欢
        • 2010-12-15
        • 1970-01-01
        • 2011-05-20
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多