2013-03-23 83 views
2

我使用YUI3 library并使用filter来匹配和替换部分URL。如果子字符串存在则返回正则表达式,然后匹配字符串的另一部分

由于过滤器是不是很灵活,我只能够用于搜索更换比赛提供了一个正则表达式的表达式,然后一个字符串:

filter: { 
    searchExp : "-min\\.js", 
    replaceStr: "-debug.js" 
} 

就我而言,我有一个看起来像这样的网址:

http://site.com/assets/js?yui-3.9.0/widget-base/assets/skins/sam/widget-base.css&yui-3.9.0/cssbutton/cssbutton-min.css 

我想匹配/assets/js如果有.css文件。如果参数包含一个CSS文件,那么它将始终只包含CSS文件。

到目前为止,我已经写了一个小的正则表达式来检查的.css在最后的存在:

.*\.css$ 

不过,现在,如果我们有一个比赛,我想回/assets/js作为比赛。这是正则表达式可行吗?个人而言,我宁愿用简单的函数和简单的if/else来完成,但由于局限性(我只能使用正则表达式),我需要找到一个正则表达式的解决方案。

+0

AFAIK它是不可能通过只使用正则表达式 – 2013-03-23 04:28:09

+0

你想只返回“/资产/ JS”如果一个CSS文件中找到(任何或特定的一个)还是你想要返还别的东西? – 2013-03-23 04:37:02

+0

@Christian P.是的,如果发现一个CSS,我想返回'/ assets/js' :) – F21 2013-03-23 04:37:58

回答

0

这是一个有点砍死在一起,但应该做的工作:

var t = new RegExp("/assets/js(([^\\.]*\\.)*[^\\.]*\\.css)$") 

document.write("http://site.com/assets/js?yui-3.9.0/widget-base/assets/skins/sam/widget-base.css&yui-3.9.0/cssbutton/cssbutton-min.css".replace(t, "/newthing/$1")); 

本质上,它搜索/assets/js,后跟任意字符,然后.css。如果全部匹配,则将其替换为新文本,并在其之后包含匹配的模式(来自第一个括号)。一切从/assets不包括在比赛,所以不需要包括在内。

我想你的图书馆在内部使用replace,所以这些字符串应该工作。具体来说,

"/assets/js(([^\\.]*\\.)*[^\\.]*\\.css)$" 
"/newthing/$1" 

我不太清楚你想要的结果做什么,但是这允许您更改的文件夹,并在第一位置添加后缀(以及检查这两个标记的存在)。要添加一个后缀更改替换此:

"/assets/js$1-mysuffix" 
+0

这个技巧。 :)感谢您的好解释:) – F21 2013-03-23 04:49:41