web-dev-qa-db-ja.com

Dreamweaver Regex-正規表現での比類のない)

問題

私が取り組んでいる問題は、$ _ GET [name]や$ _GET ['name']のようなセット変数に取り組んでいるコードの過去の開発者です。コードを統一しようとして、$ _ GET ['name']のようにすべてを作成したいと思います。

試行された解決策

カスタムのDreamWeaverスクリプトでは、次のものを使用しました。

dreamweaver.setUpFindReplace({
    searchString: "\$(_POST|_SESSION|_GET)\[([^\'][0-9a-zA-Z _]+?[^\'])\]",
    replaceString: "$$1['$2']",
    searchWhat: "document",
    searchSource: true,
    useRegularExpressions: true
});
dreamweaver.replaceAll();

追加情報

カスタムスクリプトから実行するとエラーが発生しますが、検索プロンプト(CTRL + F)内で同じ「searchString」と「replaceString」を実行するとエラーが発生しません。

検索プロンプトは、それが発生したインスタンスを喜んで検索して置き換えます。

誰かが事実を指摘する前に-はい、検索プロンプトを実行してそこから実行することもできますが、カスタムスクリプトを実行して、他の20個ほどの検索と置換のオプションを実行する必要があります。

どこかに最終結果の例がありますか?

必ず行います。正規表現101で使用されている正規表現があります- https://regex101.com/r/bE9kN6/1

最後に...

比類のない括弧の問題を止める方法を知っている人はいますか?しばらく試してみましたが、一致しない括弧がないため、解決策が見つかりません。

ソリューション

これを理解してくれたボブに感謝します。 DreamweaverはJS正規表現を使用し(PHPとは異なるとは思いませんでしたが、1つはPOSIXで、もう1つはPerl正規表現[または何か...])、リテラルは\\ではなく\でエスケープする必要があります。

これにより、最終的な機能が実現しました。

dreamweaver.setUpFindReplace({
    searchString: "\\$(_POST|_SESSION|_GET)\\[([^\'][0-9a-zA-Z _]+?[^\'])\\]",
    replaceString: "$$1['$2']",
    searchWhat: "document",
    searchSource: true,
    useRegularExpressions: true
});
dreamweaver.replaceAll();
2
MrMarlow

あなたの脱出は少しずれています。 JavaScriptを使用しているようで、文字列リテラル"\$(_POST|_SESSION|_GET)\[([^\'][0-9a-zA-Z _]+?[^\'])\]"$(_POST|_SESSION|_GET)[([^'][0-9a-zA-Z _]+?[^'])]と評価されます。

代わりに、"\\$(_POST|_SESSION|_GET)\\[([^'][0-9a-zA-Z _]+?[^'])\\]"と評価される\$(_POST|_SESSION|_GET)\[([^'][0-9a-zA-Z _]+?[^'])\]を使用する必要があります。


ここでの理由は、実際には2つのレベルの解析が行われており、それぞれに独自のエスケープルールがあるためです。まず、JavaScript文字列リテラルがあります。これにより、新しい行の_\n_などをエスケープできます。ただし、_"\["_のような認識されないエスケープシーケンスは、黙って飲み込まれ、_[_を生成します。正規表現エンジンは_[_を認識し、文字クラスの開始を示します。

正規表現エンジンがパターン内の文字通りの円記号を受け取るようにします。これを行うには、最初にリテラルの円記号を含むJS文字列を生成する必要があります。つまり、文字列リテラルでバックスラッシュ自体をエスケープする必要があるため、_"\\"_は_\_を生成します。 _"\\["_は、文字列_\[_を生成します。このようにして、正規表現エンジンは_\[_を認識し、エスケープされた(リテラル)ブラケットを示します。

もう1つは、単一引用符は正規表現で特別な意味を持たず、二重引用符で囲まれた文字列内の単一引用符はJSによって通常の文字として扱われるため、エスケープする必要がまったくないことです。


別のオプションがありますが、DreamWeaverがそれを受け入れるかどうかはわかりません。 JavaScriptには 特別な正規表現リテラル構文 があるため、最初に文字列を作成する必要はありません。その余分な解析ステップをスキップすることで、実際にはダブルエスケープの必要性を回避できます。 JS正規表現リテラルの形式は_/pattern/options_です(スラッシュはエスケープする必要がありますが、このパターンにはありません)。したがって、パターンは/\$(_POST|_SESSION|_GET)\[([^'][0-9a-zA-Z _]+?[^'])\]/として表すことができます。繰り返しになりますが、一重引用符をエスケープする必要はまったくありません。

DreamWeaverが正規表現リテラル構文をサポートしている場合、これは実際に推奨されるオプションです。

1
Bob