我正在使用由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;
},
答案 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)