我使用此正则表达式将嵌入的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+个字符