1

任何人都知道我怎么能做到这一点:

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

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]
4

3 回答 3

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 返回一个匹配数组,但您的代码只会替换该数组中的第一个匹配项。您必须遍历数组来处理 OTHER 匹配项。

于 2013-07-30T16:14:55.743 回答
0

使用正则表达式时有几种方法。

一种是做匹配——跟踪匹配的位置和匹配的长度。然后,您可以将原始消息拆分为子字符串并将它们全部连接在一起。

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

于 2013-07-30T16:15:29.723 回答
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;
于 2013-07-30T16:20:15.777 回答