問題
私が取り組んでいる問題は、$ _ 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();
あなたの脱出は少しずれています。 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が正規表現リテラル構文をサポートしている場合、これは実際に推奨されるオプションです。