2

Проблема

Проблема, с которой я сталкиваюсь, заключается в том, что в прошлом разработчики некоторого кода, над которым я работаю, устанавливают переменные, такие как $ _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();

Дополнительная информация

Когда я получаю сообщение об ошибке при запуске его из пользовательского сценария, я не получаю его при запуске тех же строк "searchString" и "replaceString" в строке поиска (CTRL + F).

Подсказка поиска с радостью найдет и заменит случаи, когда это происходит.

Прежде чем кто-то потенциально укажет на этот факт - да, я мог бы просто запустить «Поиск приглашения» и сделать это оттуда, но мне все еще нужно запустить собственный сценарий, чтобы запустить остальные 20 или около того параметров поиска и замены.

У вас есть пример конечных результатов где-нибудь?

Конечно да. У меня есть регулярное выражение, используемое в Regex 101 - https://regex101.com/r/bE9kN6/1

В заключение...

Кто-нибудь знает, как остановить проблему непревзойденных скобок? Я пытался какое-то время, и я не могу найти решение, так как нет непревзойденных скобок.

Решение

Спасибо Бобу за выяснение этого. Dreamweaver использует JS regex (который, как я не думал, отличается от PHP, но оказывается, что POSIX - один, perl-regex [или что-то ...]), и литералам нужно экранировать с помощью \\ not \ .

Это сделало окончательную, рабочую функцию;

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

1 ответ1

1

Ваше побег немного сбит. Похоже, вы используете 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 _]+?[^'])\] .


Причина в том, что на самом деле у вас есть два уровня синтаксического анализа, каждый со своими собственными правилами экранирования. Во-первых, у вас есть строковый литерал JavaScript, который позволяет экранировать такие символы, как \n для новой строки. Однако нераспознанные escape-последовательности, такие как "\[" , молча проглатываются и производят [ . Движок регулярных выражений видит [ , указывая начало класса символов.

Вы хотите, чтобы механизм регулярных выражений получал буквальные обратные слеши в шаблоне. Для этого вы должны сначала создать строку JS, содержащую буквенные обратные косые черты. Это означает, что вы должны избегать обратной косой черты в строковом литерале, поэтому "\\" производит \ , например "\\[" производит строку \[ . Таким образом, механизм регулярных выражений видит \[ , указывая экранированную (буквальную) скобку.

Другое дело, что одиночные кавычки вообще не нужно экранировать, поскольку они не имеют специального значения в регулярном выражении, а одиночные кавычки внутри строки в двойных кавычках обрабатываются JS как обычные символы.


Есть еще один вариант, но я не уверен, что DreamWeaver его примет. JavaScript имеет специальный синтаксис регулярных выражений, поэтому вам не нужно сначала создавать строку. Пропустив этот дополнительный шаг разбора, вы фактически избегаете необходимости двойного выхода. Литерал регулярного выражения JS имеет форму /pattern/options (косые черты необходимо экранировать, но в этом шаблоне их нет). Таким образом, ваш шаблон может быть выражен как /\$(_POST|_SESSION|_GET)\[([^'][0-9a-zA-Z _]+?[^'])\]/ . Еще раз, одинарные кавычки не нужно вообще избегать.

Если DreamWeaver поддерживает литеральный синтаксис regex, это на самом деле предпочтительный вариант.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .