如何在消息中的“*”标签之间着色文本?

时间:2013-07-30 16:11:16

标签: php

任何人都知道如何实现这一目标:

我希望发布消息并将“*”标签之间的所有内容着色。 像这样:

This [*]is[*] test [*]message[*] :)

要:

This [yellow]is[/yellow]> test [yellow]message[/yellow] :)

我想这样做是为了实现我的目标:

if(preg_match_all('/\*(.*?)\*/',$message,$match)) {  
    $beforemessage = explode("*", $message, 2);      
    $message = $beforemessage[0]. " <font color='yellow'>" .$match[0][0].   "</font>";           
}

如果只返回:

This [yellow]is[yellow]

3 个答案:

答案 0 :(得分:4)

只需使用preg_replace()

$message = "This *is* test *message*";
echo preg_replace('/\*(.*?)\*/', '<font color="yellow">$1</font>', $message);

This <font color="yellow">is</font> test <font color="yellow">message</font>

preg_match_all返回一个匹配数组,但您的代码只替换该数组中的FIRST匹配。你必须遍历数组来处理OTHER匹配。

答案 1 :(得分:0)

使用正则表达式时有一些方法。

一个是进行匹配 - 跟踪比赛的位置和比赛的长度。然后,您可以将原始消息拆分为子字符串,并将它们重新连接在一起。

另一种是使用正则表达式进行搜索/替换。

答案 2 :(得分:0)

尝试这个或类似方法:

<?php

$text = "Hello hello *bold* foo foo *fat* foo boo *think* end.";

$tagOpen = false;

function replaceAsterisk($matches) {
    global $tagOpen;

    $repl = "";

    if($tagOpen) {
        $repl = "</b>";
    } else {
        $repl = "<b>";
    }

    $tagOpen = !$tagOpen;

    return $repl;
}

$result =  preg_replace_callback( "/[*]/", "replaceAsterisk", $text);

echo $result;