0

我正在开发一个提及系统并且我遇到了一个问题,当我循环并将提及更改为链接时,它将用相同的链接替换 ​​@tom 和 @tom123 等类似的链接到 /tom/ 而不是单个.

我试过使用 regex 和 preg_replace 但是我也在检查用户名是否真的存在,所以我只是想知道是否有办法阻止它发生。

$tweet = "@wayne how are you? @wayne123 is cool but are you?";

        preg_match_all('/(^|\s)@([a-z0-9_]+)/i', $tweet, $matches);
        $i = 0;

        foreach( $matches[2] as $value ) 
        {   

            if ( $db_query )
            {
                $tweet = str_replace("@" . $value, "<a href=\"/user/$value\">@$value</a>!", $tweet);
            }               
        }

        echo $tweet; // outputs: hi <a href="/user/wayne">@wayne!</a> how are you? <a href="/user/wayne">@wayne!</a>123 is cool but are you?

非常感谢任何帮助,我之前曾尝试过使用正则表达式,但它继续沿线并更新其他人,然后我什至能够检查它们是否是有效用户

4

3 回答 3

2

我认为而不是:

$tweet = str_replace("@" . $value, "@$value!", $tweet);

你应该使用:

$tweet = preg_replace('/@' . $value.'\b/', "<a href=\"/user/$value\">@$value</a>!", $tweet);
于 2013-05-02T14:47:43.623 回答
0

问题是第一次通过循环@wayne123 被@wayne 替换,因此第二次通过循环找不到匹配项。

preg_replace与反向引用一起使用。

$tweet = "@wayne how are you? @wayne123 is cool but are you?";
$pattern = '/(^|\s)@(\w+)/';
$replacement = '<a href="/user/$2">@$2</a>';
print preg_replace($pattern, $replacement, $tweet);

in$replacement$2替换为第二组括号的匹配项(\w)

请注意,这(\w)([a-zA-Z0-9_])

于 2013-05-02T14:38:53.780 回答
0

添加空格?

$tweet = str_replace("@" . $value." ", "<a href=\"/user/$value\">@$value</a>! ", $tweet);

preg_replace 更有用

于 2013-05-02T14:45:45.817 回答