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

0

問題は、最初のループで @wayne123 が @wayne に置き換えられるため、ループで 2 回目の一致を見つけることができないことです。

後方参照で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);

$replacement$2括弧の 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 に答える