0

我需要编辑模板区域并生成.htaccess文件。这是.htaccess文件模板的一部分。这些[NPAC_TMP:~core_dir]是被替换的部分:

RewriteCond %{REQUEST_URI} !^[NPAC_TMP:~core_dir]/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ [NPAC_TMP:~core_dir]/$1
RewriteCond %{HTTP_HOST} ^(www.)?localhost:8888$
RewriteRule ^(/)?$ [NPAC_TMP:~core_dir]/index.php [L] ###DEFECTIVE LINE

红宝石脚本:

template_tag = line.match(/\[NPAC_TMP:~(.*)\]/).to_s
param        = template_tag.split("~")[1][0..-2]

if(param == "core_dir")
  line[template_tag]= CONFIG[:core_dir]
  temp_file.puts line
end

当脚本运行时,除了最后一个之外,所有这些都被正确替换:

RewriteCond %{REQUEST_URI} !^core/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ core/$1
RewriteCond %{HTTP_HOST} ^(www.)?localhost:8888$
RewriteRule ^(/)?$ [NPAC_TMP:~core_dir]/index.php [L] ###DEFECTIVE LINE

这不是该方法运行的唯一模板文件,在所有其他文件中,它在所有项目都被替换的地方都能正常工作。

出于故障排除的目的,我复制了RewriteCond %{REQUEST_URI} !^[NPAC_TMP:~core_dir]/"并将其直接放在有缺陷的行下方。这个添加的项目正确更新,但它上面的那个仍然没有。

然后,我也将有缺陷的行的副本直接放在它的正下方,并收到了两条有缺陷的行,这让我相信它的某些东西是这个完整的字符串的结构导致 REGEX 关闭:RewriteRule ^(/)?$ [NPAC_TMP:~core_dir]/index.php [L]

任何帮助将不胜感激。此外,如果您对如何缩短或改进脚本的 Ruby 部分有任何建议,我会全力以赴。

4

2 回答 2

2

忘记让组不贪心:

template_tag = line.match(/\[NPAC_TMP:~(.*)\]/).to_s

应该:

template_tag = line.match(/\[NPAC_TMP:~(.*?)\]/).to_s

解决了这个问题,现在匹配所有案例。

于 2013-06-09T06:20:41.753 回答
1

.*你的正则表达式中的\[NPAC_TMP:~(.*)\]是贪婪的(它尽可能匹配),所以它匹配

[NPAC_TMP:~core_dir]/index.php [L]

这给了你小组

core_dir]/index.php [L

http://rubular.com/r/NbZxd5prdT

您应该使用[^]]*(或[^]]+代替.*

http://rubular.com/r/h0YcyWfvgu

下次如果您遇到正则表达式问题,一个好方法是打印/跟踪您的匹配项,这样您就可以看到您正在匹配的内容。

我也总是只是“开发”/用rubular编写我的正则表达式,以确保它们按我的预期工作。

于 2013-06-09T06:21:58.897 回答