Проверьте слово после символа " @ " в PHP

Я делаю систему новостей и комментариев на данный момент, но я застрял в одной части на некоторое время. Я хочу, чтобы пользователи могли ссылаться на других игроков в стиле twitter, например @username. Скрипт будет выглядеть примерно так: (не настоящий 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 ответов


вот тут регулярные выражения войти.

<?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-z, A-Z, 0-9 и _.
  3. на (?<!\w)@ немного продвинутый, но он называется отрицательное утверждение lookbehind, а значит, " Ан @ что делает не следовать букве."Это для того, чтобы вы не включали такие вещи, как адреса электронной почты.
  4. на \w+ означает " один или несколько символов слова.- The + называется Квантор.
  5. в скобки \w+ захват часть заключена в скобки и отображается в $matches.

regular-expressions.info кажется, популярный выбор учебника, но есть много другие онлайн.


похоже на задание для 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);

считаете использовать API Twitter для ловли логин из вашего текста: https://github.com/twitter/twitter-text-js


вот выражение, которое будет соответствовать тому, что вам нужно, но не будет захватывать адреса электронной почты:

$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 are...