我从游戏中接收文字,该游戏使用文字中的颜色嵌入来为消息添色,你只需使用它:{ff0000}红色文字{00ff00}绿色文字
我想通过php输出这样的字符串并使其正确着色。 所以上面的字符串变成了这个
<span style="color: #ff0000">red text </span><span style="color: #00ff00">green text</span>
我对此有一些想法(就像我知道颜色的第一个匹配需要替换为<span ..>
,并且任何下一个匹配都需要替换为</span><span ...>
以关闭上一个span标记,如果找到至少一个匹配项,则需要将另一个span结束标记添加到字符串的末尾。
我可能会过度复杂化并使用循环和比较文本手动执行此操作,但这会很复杂并且可能效率低下。
我怎么能用php中的一些正则表达式函数(可能还有一个循环)呢?
答案 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
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);
答案 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>