0

次のコードを使用して、特定のページに許可または禁止のフラグが設定されているかどうかに応じて 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) 線を抜いた後

ここに画像の説明を入力

下部にある追加の空白行にも注意してください。不許可とその改行の削除に加えて、これらの空白行をすべて失う必要があります。

4

1 に答える 1

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') />

両端をトリムし、すべての改行を削除してから、少なくとも 2 つの改行のすべてのインスタンスを 1 つの改行に置き換えます。

(しかし、一般的には、複数の改行を一括で削除するよりも、最初のより具体的な表現をお勧めします。)

于 2012-09-12T13:01:03.700 に答える