【问题标题】:Extract just the path from CSS and exclude anything after the path仅从 CSS 中提取路径并排除路径后的任何内容
【发布时间】:2019-04-27 22:12:52
【问题描述】:

使用下面的正则表达式,我可以从 CSS 中提取路径,但结果还包括“#”和“?”之后的位。有什么办法可以提取路径

正则表达式

url\([\s]?[\"|\']?(.*?)[\"|\']?[\s]?\)

字符串

url('../fonts/Google_OpenSans/open-sans-v15-latin-italic.eot?#iefix') format('embedded-opentype')
url('../fonts/Google_OpenSans/open-sans-v15-latin-italic.woff2') format('woff2')
url('../fonts/Google_OpenSans/open-sans-v15-latin-italic.woff') format('woff')
url('../fonts/Google_OpenSans/open-sans-v15-latin-italic.ttf') format('truetype')
url('../fonts/Google_OpenSans/open-sans-v15-latin-italic.svg#OpenSans') format('svg')

预期

../fonts/Google_OpenSans/open-sans-v15-latin-italic.eot

实际

../fonts/Google_OpenSans/open-sans-v15-latin-italic.eot?#iefix

【问题讨论】:

标签: php css regex


【解决方案1】:

你可以使用

url\(\s*(["']?)([^()?#]*)(?:[#?].*?)?\1\s*\)

请参阅regex demo。结果将在第 2 组中。

详情

  • url\( - url( 子字符串
  • \s* - 0+ 个空格
  • (["']?) - 第 1 组:可选的 '"
  • ([^()?#]*) - 第 2 组:除 ?#)( 之外的任何 0+ 个字符
  • (?:[#?].*?)? - 一个可选子字符串,以 ?# 开头,然后包含除换行符以外的任何 0+ 字符,尽可能少(为了提高效率,将此处的 .*? 替换为 [^()]* ,参见this demo)
  • \1 - 与第 1 组捕获的值相同
  • \s* - 0+ 个空格
  • \) - 一个 ) 字符。

【讨论】:

    【解决方案2】:

    如果您正在寻找基于非正则表达式的选项,我编写了这个小函数,它可以解析 URL 或路径并给出正确片段的对象:

    function parseURL (url) {
        url = decodeURI(url);
        let split = {}
            split["?"]    = url.split("?")
            split["path"] = split["?"][0]
            split["tmp"]  = split["?"][1].split("#")
            split["#"]    = split["tmp"][1]
            split["?"]    = split["tmp"][0]
    
        let params = {};
    
        split["?"].split("&").forEach(i => {
            let tmp = i.split("=");
            params[tmp[0]] = tmp[1];
        }) 
    
        return {
            path: encodeURI(split["path"]),
            params,
            fragments: split["#"]
        }
    }
    

    您需要做的就是从返回的对象中获取path 属性。

    $ node
    > parseURL("https://example.com/path/to/resource?name=param&purpose=none#extrainfo")
    > {
        path: "https://example.com/path/to/resource",
        params: {
          name: "param",
          purpose: "none"
        },
        fragments: "extrainfo"
      }
    >
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-09
      • 2010-10-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 2018-07-18
      • 2011-03-16
      相关资源
      最近更新 更多