preg_replace具有相似的值

时间:2013-05-02 14:12:27

标签: php preg-replace str-replace

我正在开发一个提及系统,我遇到了一个问题,当我循环并将提及更改为链接时,它将替换类似的@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?

我非常感谢任何帮助,我之前尝试使用正则表达式,但它继续沿着这条线进行更新,然后我才能检查它们是否是有效的用户

3 个答案:

答案 0 :(得分:2)

我认为不是:

  

$ tweet = str_replace(“@”。$ value,“@ $ value!”,$ tweet);

您应该使用:

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

答案 1 :(得分: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);
<{1>} $replacement $2替换为第二组括号(\w)的匹配

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

的简写

答案 2 :(得分:0)

添加空格?

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

preg_replace更有用