由于现有的正则表达式匹配,语法 - highlighter正则表达式无法正常工作

时间:2011-12-30 07:49:51

标签: javascript regex syntax-highlighting

我正在使用由Alex Gorbatchev使用Javascript构建的语法高亮显示器(http://alexgorbatchev.com/SyntaxHighlighter/download/)

Javascript为每种语言都有单独的“brush”js文件,它支持语法,这些刷文件只是该特定语言的所有语法匹配的正则表达式,它匹配项目然后将它们包装在CSS类中。 / p>

目前,PHP刷子文件几乎与所有内容相匹配,但缺少一件事,PHPDoc注释变量。

/**
* @author Jason Davis
* @copyright 2011
*/

@author@copyright就是我在这个例子中所说的。

所以我现在有一些匹配这些的正则表达式然而它不起作用,因为当前的评论正则表达式正在停止它...

以下是与PHP注释匹配的正则表达式代码片段

SyntaxHighlighter.brushes.Php = function ()
{
    this.regexList = [

        // Multi Line Comments
        { regex: /\/\*[\s\S]*?\*\//gm,
            css: 'php-comment comments' },

        // More regex for all the other stuff is below here.......
    ];
};

现在,如果我添加PHPDoc注释变量的新代码......

// PHPDoc Comment Variables (ie @author)
{ regex: /@[a-z]+/g,
    css: 'php-phpdoc phpdoc' }

即使我的新正则表达式有效,它也行不通。如果我在我的新代码上面禁用了注释正则表达式,那么它可以工作并用CSS类包装我的PHPDoc注释变量。

所以我在想,也许如果我可以修改我的PHPDoc正则表达式在评论正则表达式中休息可能会有效吗?如果您有任何想法或可以提供帮助,我可以真正使用它并欣赏它


更新

我想我找到的代码阻止它工作...... 我的代码嵌套在一个Comment匹配中,这段代码说明它可以防止这种情况,也许这可以修改为允许我的PHPDoc保持嵌套而不是删除它

此处https://github.com/alexgorbatchev/SyntaxHighlighter/blob/master/scripts/shCore.js位于 1318

/**
 * Checks to see if any of the matches are inside of other matches. 
 * This process would get rid of highligted strings inside comments, 
 * keywords inside strings and so on.
 */
removeNestedMatches: function(matches)
{
    // Optimized by Jose Prado (http://joseprado.com)
    for (var i = 0; i < matches.length; i++) 
    { 
        if (matches[i] === null)
            continue;

        var itemI = matches[i],
            itemIEndPos = itemI.index + itemI.length
            ;

        for (var j = i + 1; j < matches.length && matches[i] !== null; j++) 
        {
            var itemJ = matches[j];

            if (itemJ === null) 
                continue;
            else if (itemJ.index > itemIEndPos) 
                break;
            else if (itemJ.index == itemI.index && itemJ.length > itemI.length)
                matches[i] = null;
            else if (itemJ.index >= itemI.index && itemJ.index < itemIEndPos) 
                matches[j] = null;
        }
    }

    return matches;
},

1 个答案:

答案 0 :(得分:1)

您可以通过声明@foo将跟随它来匹配评论块内的*/字符串(并在出现任何/*之前执行此操作):

regex: /@[a-z]+\b(?=(?:(?!\/\*)[\s\S])*\*\/)/g

<强>解释

@[a-z]+     # Match a PHPDoc comment variable.
\b          # Assert position at the end of the variable.
(?=         # Assert that the following can be matched from here:
 (?:        # Try to match...
  (?!       #  (unless the next thing that follows is...
   \/\*     #  /* )
  )         #  (end of negative lookahead)
  [\s\S]    #  any character
 )*         # any number of times
 \*\/       # until a */ occurs.
)           # (end of positive lookahead)