我正在使用以下代码更新robots.txt,具体取决于特定网页是标记为允许还是禁止。
<cflock type="exclusive" timeout="5">
<cfset vRemoveLine = ListContainsNoCase(robots,"Disallow: #sURL#", "#chr(13)##chr(10)#")>
<cfif vRemoveLine>
<cfset robots = ListDeleteAt(robots, vRemoveLine, "#chr(13)##chr(10)#")>
</cfif>
<cffile action="write"
file="#sitePath#robots.txt"
output="#robots#"
nameconflict="overwrite">
</cflock>
然而,它没有完成和/或可以写得更好。具体来说,当删除一行时,它也不会消除其相关的回车,如果该行除了右下方以外的任何地方则更是如此。
截图:
1)删除行
之前
2)删除行后
另请注意底部的附加空白行。除了删除禁令及其换行符之外,我还需要丢失所有这些空白行。
答案 0 :(得分:2)
实际上,更加注意你的代码,你可以简单地做......
<cfset robots = robots.replaceAll( "(?m)^Disallow: #ReEscape(sURL)#(?:\r?\n|\z)" , "" ) />
...而不是那些List函数。
这会删除您刚删除的行的换行符,但不会删除文件中其他位置的换行符(可能会拆分部分并提高可读性)。
如果你想确保文件末尾没有空格,你当然还可以使用trim。
作为解释,以下是扩展/评论形式的上述正则表达式:
(?x) ## enable extended/comment mode
## (literal whitespace is ignored, hashes start comments, also ignored)
(?m) ## enable multiline mode
## (meaning ^ and $ match start/end of each line, as well as of entire input)
^Disallow:\ ## Match literal text "Disallow: " at start of a line.
## (In comment mode, a \ is needed before the space
## in standard use this is not required.)
#ReEscape(sURL)# ## use ReEscape to avoid issues since the URL might
## contain characters that are non-literal in a regex.
(?: ## non-capturing group to contain alternation between...
\r?\n ## match optional carriage return followed by a newline.
| ## or
\z ## match end of input (whether there is a newline there or not)
)
(要在CFML中使用它,将其包装在cfsavecontent和cfoutput中,然后将结果变量放在robot.replaceAll(here,'')
中。)
如果你真的想确保文件中没有多个换行符,(无论与删除禁止行相关的任何更改),最简单的方法是:
<cfset robots = robots.trim().replaceAll('\r','').replaceAll('\n{2,}','\n') />
修剪两端,然后删除所有回车符,然后用一个换行符替换至少两个换行符的所有实例。
(但总的来说,我可能会建议在多条换行符的一揽子删除中使用最初更具体的表达方式。)