求指正一段正则表达式

2014-01-17 21:03:22 +08:00
 EchoFUN
需求是要给网站的静态的文件打版本号。

比如模板中的某段原代码如下:
<link rel="stylesheet" href="/static/css/main.css?v=$$$$$$$$$$">
最终在node.js脚本处理后需要变成
<link rel="stylesheet" href="/static/3333333333/css/main.css">
中间的3333333333是当前静态文件的版本号

小弟正则的功力比较浅。
尝试着写了一段,/"\/(static)\w+\?v=\${10}"/gi,想用javascript的replace进行替换。
却死活匹配不上, 跪求大神指点。
4202 次点击
所在节点    程序员
19 条回复
Mutoo
2014-01-17 21:28:11 +08:00
因为 \w 不包括 /

\w 相当于 [A-Za-z_]
1423
2014-01-17 21:29:39 +08:00
(static\/)(.*?)\?v=([^\"]*)
$1$3$2
效果:
http://regexr.com?381l4

不知为何我感觉提问正则的描述问题时都有点含糊不清
zhujinliang
2014-01-17 21:38:32 +08:00
\w 不匹配 / 和 . 这两个符号吧
可以用 [^?] 来代替,意思是非 ? 的字符,或者用 [\w\./] 堆砌出需要的字符

要替换的话需要给后面的 css/main.css 分一个组吧
最终正则: /"\/static\/([^?]+)\?v=\${10}"/

要替换的话,这样用: test.replace(/"\/static\/([^?]+)\?v=\${10}"/gi, '"/static/3333333333/$1"')
switch
2014-01-17 21:48:04 +08:00
test.replace(/(\/static\/)(.*)(?=[?&]v=)(?:([?&])v=(\d+)(&?))/, function ($0, $1, $2, $3, $4, $5) {
return $1 + $4 + "/" + $2 + ("?" === $3 ? ("&" === $5 ? "?" : "") : $5);
})
EchoFUN
2014-01-17 22:16:09 +08:00
谢谢大家,试了下。
这个正则应该够用了。
test.replace(/("\/static)(\/[^"\?]*)\?v=(\${10})"/ig, function($0, $1, $2, $3) {
return $1 + '/3333333333' + $2 + '"';
});
@switch 写的好复杂哈,我消化消化。
mengzhuo
2014-01-17 22:50:36 +08:00
继续四处强调,xml用解析器,不要用正则
zhaoyafei
2014-01-17 22:58:11 +08:00
@zhujinliang 正则大牛,求有时间帮忙写个搞rss的
EchoFUN
2014-01-18 00:56:51 +08:00
@mengzhuo 有道理哈。但是模板文件里边有拼装HTML的逻辑。并非单纯的xml哦。
EchoFUN
2014-01-18 00:59:19 +08:00
@zhaoyafei 原来是个用萌妹子头像的汉子,刚准备兴冲冲的表示要手把手教你点什么的。。。
ETiV
2014-01-18 01:22:18 +08:00
@EchoFUN 这个人很逗, 因为他楼上刚说过"强调, XML用解析器, 不要用正则".

他来一句"正则大牛, 求有时间帮忙写个搞RSS的"
alexrezit
2014-01-18 09:01:19 +08:00
楼主明显是个逗比.
leechan
2014-01-18 10:52:08 +08:00
楼主,一定需要这么复杂的正则么?我觉得如果只是要把上面的字符串变换成下面的形式的话就不需要这么复杂呀

str.replace(/\?v=\${10}/g, '').replace('static/', 'static/333333333/')

我觉得这样就可以了呀
EchoFUN
2014-01-18 11:48:06 +08:00
@leechan 哥,别闹!会砸饭碗的。
zztczcx
2014-01-18 13:52:37 +08:00
s.replace(/(\/css.*)\?v\=(.*)(\".*)$/g,"/$2$1$3")
SoloCompany
2014-01-18 13:57:33 +08:00
为什么不改成
<link rel="stylesheet" href="/static/$$project.version$$/css/main.css”>

然后源代码里面直接就有 $$project.version$$ 这个目录存在,这样替换起来多简单
EchoFUN
2014-01-18 14:06:09 +08:00
@SoloCompany 开发思路可能跟你说的不一样哈,不是所有的静态文件都要打版本号的,需要更新版本的静态在文件后边加上 ?v=$$$$$$$$$
xoyo
2014-01-19 22:39:37 +08:00
@mengzhuo 人家这匹配的是xml文本里某个值的内容,用xml解释器怎么做呢?
mengzhuo
2014-01-19 22:55:13 +08:00
ianva
2014-01-20 22:15:58 +08:00
过滤脚本可以用 sed
/ *<link/{
s:\(/static/\)\([^\?][^\?]*/\)*\([a-z0-9_-][a-z0-9_-]*.css\)?v=\([0-9]*\)\":\1\4/\2\3:
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/97438

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX