我使用此正则表达式将嵌入的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>,请注意{some text that isn't a color}不会包装在任何span标记中,尽管它仍应位于上一个标记中。我不知道如何解决它。

最佳答案

JS regexp不支持子例程,但是您可以将块定义为变量,并动态构建模式。另外,(?>[^{]*{?(?!(?1)}))*部分太神秘了(并且包含JS RegExp不支持的原子组(?>...)),它的作用是匹配除{之外的所有0+字符十六进制字符直到结束},依此类推直到RGB模式(一种展开式原理变化)。

相当于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


请参见JS regex demo here


{-一个{字符
([a-fA-F0-9]+)-组1:一个或多个(使用{6}仅匹配6个)十六进制字符
}-一个}字符
([^{]*(?:{(?![a-fA-F0-9]+})[^{]*)*)-第2组:


[^{]*-{以外的任何0+个字符
(?:{(?![a-fA-F0-9]+})[^{]*)*-以下模式序列的零次或多次出现:


{-就是...的{
(?![a-fA-F0-9]+})-不后跟1+十六进制字符,然后是}
[^{]*-{以外的任何0+个字符

10-07 16:16