我有这个正则表达式将嵌入的RGB颜色{rrggbb}(总是用大括号括起来的6个字符)替换为html span标记:
{([a-fA-F0-9]+)}((?>[^{]*{?(?!(?1)}))*)
它的使用方式如下:
preg_replace('~{([a-fA-F0-9]+)}((?>[^{]*{?(?!(?1)}))*)~',
'<span style="color: #$1">$2</span>', $text);
它在php中的preg_replace运行良好,但是当试图在javascript中使用它时,我收到语法错误(?前面的标记无法量化)
如何让它在javascript中运行?
注意我还有另一个正则表达式:{([a-fA-F0-9]{6})\}([^\{]+)
,但如果我执行以下操作:{ff0000}red text {some text that isn't a color} {00ff00}blue text
我的输出结果为:<span style="color: #ff0000">red text </span>{some text that isn't a color} <span style="color: #00ff00">blue text</span>
,请注意{{1} }未包含在任何{some text that isn't a color}
标记中,但它仍应位于上一个标记中。我不知道如何解决它。
答案 0 :(得分:1)
JS regexp不支持子例程,但您可以将块定义为变量,并动态构建模式。此外,(?>[^{]*{?(?!(?1)}))*
部分过于神秘(并且包含JS RegExp不支持的原子组(?>...)
),它所做的只是匹配{{1以外的任何0+字符没有跟随十六进制字符一直到结束{
,依此类推到RGB模式(一种unroll-the-loop原则变体)。
JS等效于
}
使用的模式是
var s = "{ff0000}red text {some text that isn't a color} {00ff00}blue text";
var xdigit = "[a-fA-F0-9]+";
var result = s.replace(new RegExp("{("+xdigit+")}([^{]*(?:{(?!"+xdigit+"})[^{]*)*)", "g"), '<span style="color: #$1">$2</span>');
console.log(result);
/{([a-fA-F0-9]+)}([^{]*(?:{(?![a-fA-F0-9]+})[^{]*)*)/g
- {
字符{
- 第1组:一个或多个(使用([a-fA-F0-9]+)
仅匹配6)十六进制字符{6}
- }
字符}
- 第2组:
([^{]*(?:{(?![a-fA-F0-9]+})[^{]*)*)
- 除[^{]*
{
- 以下一系列模式出现零次或多次:
(?:{(?![a-fA-F0-9]+})[^{]*)*
- {
即...... {
- 未跟随1+十六进制字符,然后是(?![a-fA-F0-9]+})
}
- 除[^{]*