как токенизировать / анализировать строковые литералы из исходного кода JavaScript - PullRequest
2 голосов
/ 24 марта 2009

Я работаю над программой на C #, которая должна загрузить некоторый код JavaScript, разобрать его и выполнить некоторую обработку для строковых литералов , найденных в коде (например, перезаписать их чем-то другим).

Моя проблема в том, что мне трудно придумать элегантный способ на самом деле найти строковые литералы в коде javascript.

Например, взгляните на пример кода JavaScript ниже. Видите ли вы, как даже подсвечиватель кода в Stack Overflow способен выделять строковые литералы в коде и делать их красными в цвете?

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

var dp = {
    sh :                    // dp.sh
    {
        Utils   : {},       // dp.sh.Utils
        Brushes : {},       // dp.sh.Brushes
        Strings : {},
        Version : '1.3.0'
    }
};

dp.sh.Strings = {
    AboutDialog : '<html><head><title>About...</title></head><body class="dp-about"><table cellspacing="0"><tr><td class="copy"><p class="title">dp.SyntaxHighlighter</div><div class="para">Version: {V}</p><p><a href="http://www.dreamprojections.com/syntaxhighlighter/?ref=about" target="_blank">http://www.dreamprojections.com/SyntaxHighlighter</a></p>&copy;2004-2005 Alex Gorbatchev. All right reserved.</td></tr><tr><td class="footer"><input type="button" class="close" value="OK" onClick="window.close()"/></td></tr></table></body></html>',

    // tools
    ExpandCode : '+ expand code',
    ViewPlain : 'view plain',
    Print : 'print',
    CopyToClipboard : 'copy to clipboard',
    About : '?',

    CopiedToClipboard : 'The code is in your clipboard now.'
};

dp.test1 = 'some test blah blah blah' +  someFunction()  + 'asdfasdfsdf';
dp.test2 = 'some test blah blah blah' +  'xxxxx'  + 'asdfasdfsdf';
dp.test3 = 'some test blah blah blah' +  "XXXXsdf "" \" \' ' sdfdff "" \" \' ' asdfASDaSD FASDF SDF'  + 'asdfasdfsdf";

dp.SyntaxHighlighter = dp.sh;

Я попытался разобрать в поисках кавычек, но это усложняется, когда у вас есть escape-символы в строковом литерале. Другое решение, о котором я думал, - это использовать RegEx, но я недостаточно силен с Регулярными выражениями, и я даже не уверен, что это тот путь, который мне следует изучить.

Хотелось бы посмотреть, что думает Stack Oveflow. Большое спасибо!

1 Ответ

7 голосов
/ 24 марта 2009

Регулярные выражения в глубине: расширенное сопоставление строк в кавычках содержит несколько хороших примеров того, как сделать это с помощью регулярного выражения.

Один из подходов заключается в следующем:

(["'])(?:(?!\1)[^\\]|\\.)*\1

Вы можете использовать его следующим образом:

string modifiedJavascriptText =
   Regex.Replace
   (
      javascriptText, 
      @"([""'])(?:(?!\1)[^\\]|\\.)*\1", // Note the escaped quote
      new MatchEvaluator
      (
         delegate(Match m) 
         { 
            return m.Value.ToUpper(); 
         }
      )
   );

в этом случае все строковые литералы делаются в верхнем регистре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...