在一篇文章中,我读过如果我们使用JavaScript和CSS文件(如style.css?V=1
)传递查询字符串,在某些情况下浏览器不会缓存文件。
所以我决定编写将采用/css/style.css
之类的文件路径的函数,并返回/css/style.2342342.css
,其中2342342是unix时间戳。
<cfset mtime = 2342342>
<cfset fileName = "/css/style.css">
<cfset newFileName = REReplace(fileName,'{\\.([^./]+)$}',mtime)>
<cfdump var = "#newFileName#">
我从Google搜索中获得了这个'{\\.([^./]+)$}'
正则表达式,但它无效。
我对正则表达式并不擅长。请帮忙。
答案 0 :(得分:5)
您使用正则表达式使事情过于复杂。正如jwz所说
&#34;有些人在面对问题时会想到,我知道,我会使用 正则表达式。&#34;现在他们有两个问题。&#34;
使用Coldfusion,您只需将文件名视为带有.
分隔符的列表。您希望在该列表的最后一部分之前插入mtime
值。假设您的文件名不包含多个.
,您可以使用:
<cfset newFileName = listFirst(fileName, '.') & '.' & mtime & '.' & listLast(filename, '.')>
答案 1 :(得分:5)
您找到的{\\.([^./]+)$}
不是正常运行的正则表达式 - 只要{
和}
不像正则表达式那样使用。某些语言可能会将这些语言用作正则表达式的分隔符,但在实际的正则表达式中,它们用于量词,(例如x{3,5}
匹配x和5中的3)。
此外,\\.
正在寻找文字\
后跟.
作为元字符(这不是意图 - 它应该只是\.
)。 (同样,这可能是由于示例来自要求反斜杠转义的任何语言; CF不需要它,因此这样做会干扰正则表达式行为。)
rereplace( filename , '(?=\.[^./]+$)' , '.' & mtime )
这使用预测(?=..)
而不是捕获组来简化替换方 - 在最终.
之前将替换插入位置而不替换任何实际字符
如果要更换时间戳,可以很容易地将\.\d+
添加到开头并使其正常工作。
Left(filename,filename.lastIndexOf('.')+1) & mtime & '.' & ListLast(filename,'.')
可能效率更高(但不一定达到显着水平)。
正则表达式的一个缺点是它们是单向的 - 它们从一开始就开始向前发展。对于长串,当你只关心最后几个字符,这可能意味着浪费时间看你不关心的字符。像lastIndexOf
和ListLast
这样的方法从最后开始向后工作,从而避免那些不必要的检查。同样,在这种情况下,字符串足够短,几乎肯定不会重要,但这是值得记住的事情。
答案 2 :(得分:0)
这是一个基于列表的解决方案,可能稍微简单一些 - 并且解决了Peter提到的文件名中多个.
的问题。
<cfset mtime = 2342342>
<cfset fileName = "/css/style.css">
<cfset newFileName = listInsertAt( fileName, listLen( filename, '.'), mtime, '.' ) />
您可能需要添加更多逻辑来检查listLen( filename, '.')
是否至少为2,但这是一个开始。