11

現在、ニュースとコメントのシステムを作成していますが、しばらくの間、ある部分で立ち往生しています。ユーザーが@usernameのような Twitter スタイルで他のプレイヤーを参照できるようにしたい。スクリプトは次のようになります: (実際の PHP ではなく、想像上のスクリプトです ;3)

$string = "I loved the article, @SantaClaus, thanks for writing!";
if($string contains @){ 
    $word = word after @;
    $check = is word in database? ...
}

そして、文字列内のすべての @username に対して、おそらく while() で行われます。困っています、助けてください。

4

4 に答える 4

14

これが正規表現の出番です。

<?php
    $string = "I loved the article, @SantaClaus! And I agree, @Jesus!";
    if (preg_match_all('/(?<!\w)@(\w+)/', $string, $matches))
    {
        $users = $matches[1];
        // $users should now contain array: ['SantaClaus', 'Jesus']
        foreach ($users as $user)
        {
            // check $user in database
        }
    }
?>
  1. 最初/と最後は区切り文字です(今のところこれらについては気にしないでください)。
  2. \w、、、、およびを含む単語文字を表します。a-zA-Z0-9_
  3. これ(?<!\w)@は少し進んでいますが、ネガティブルックビハインドアサーションと呼ばれ、「単語の文字に従わ@ないAn」を意味します。これは、メールアドレスなどを含めないようにするためです。
  4. \w+「1つ以上の単語文字」を意味します。は数量詞+として知られています。
  5. 周りの括弧は、括弧で囲まれた部分を\w+ キャプチャ$matchesし、に表示されます。

regular-expressions.infoはチュートリアルの人気のある選択肢のようですが、オンラインには他にもたくさんあります。

于 2012-12-26T16:22:12.290 に答える
6

preg_replace_callback() の仕事のように見えます:

$string = preg_replace_callback('/@([a-z0-9_]+)/', function ($matches) {
  if ($user = get_user_by_username(substr($matches[0], 1)))
    return '<a href="user.php?user_id='.$user['user_id'].'">'.$user['name'].'</a>';
  else
    return $matches[0];
}, $string);
于 2012-12-26T16:15:36.927 に答える
3

テキストからユーザー名を取得するために Twitter API を使用することを検討してください: https://github.com/twitter/twitter-text-js

于 2012-12-26T16:26:24.527 に答える
2

必要なものに一致する式を次に示しますが、電子メール アドレスはキャプチャされません。

$str = '@foo I loved the article, @SantaClaus, thanks for writing to my@email.com';
preg_match_all('/(^|[^a-z0-9_])(@[a-z0-9_]+)/i', $str, $matches);
//$matches[2][0] => @foo
///$matches[2][1] => @SantaClause

ご覧のとおり、my@email.com はキャプチャされませんが、@foo と @SantaClaus の文字列...

于 2012-12-26T16:33:19.030 に答える