php用<span>替换字符串中的{rrggbb}颜色到颜色文本

时间:2018-02-18 16:47:45

标签: php regex

我从游戏中接收文字,该游戏使用文字中的颜色嵌入来为消息添色,你只需使用它:{ff0000}红色文字{00ff00}绿色文字

我想通过php输出这样的字符串并使其正确着色。 所以上面的字符串变成了这个

<span style="color: #ff0000">red text </span><span style="color: #00ff00">green text</span>

我对此有一些想法(就像我知道颜色的第一个匹配需要替换为<span ..>,并且任何下一个匹配都需要替换为</span><span ...>以关闭上一个span标记,如果找到至少一个匹配项,则需要将另一个span结束标记添加到字符串的末尾。 我可能会过度复杂化并使用循环和比较文本手动执行此操作,但这会很复杂并且可能效率低下。

我怎么能用php中的一些正则表达式函数(可能还有一个循环)呢?

2 个答案:

答案 0 :(得分:3)

根本不是HTML解析,RegEx是最合适的工具:

{([a-fA-F0-9]+)}((?>[^{]*{?(?!(?1)}))*)

故障:

{   # Match `{`
    ([a-fA-F0-9]+) # Match and capture hex color code
}   # Match `}`
(   # Capturing group #2
    (?> # Start of a non-capturing group (atomic)
        [^{]*   # Match anything up to a `{`
        {?(?!(?1)}) # Match it if not going to contain a color code
    )*  # As much as possible, end of NCG
)   # End of CG #2

RegEx live demo

PHP代码:

$text = <<< 'TXT'
{ff0000}red tex {00ff00}green text
TXT;

echo preg_replace('~{([a-fA-F0-9]+)}((?>[^{]*{?(?!(?1)}))*)~',
        '<span style="color: #$1">$2</span>', $text);

PHP live demo

答案 1 :(得分:2)

您可以尝试这样的事情:

$str = '{ff0000}red text {00ff00}green text' ;
$str = preg_replace_callback('~\{([^\}]*)\}([^\{]+)~', function($matches) {
    return '<span style="color:#'.$matches[1].'">'.$matches[2].'</span>' ;
}, $str) ;
echo $str ; 

输出:

<span style="color:#ff0000">red text </span><span style="color:#00ff00">green text</span>