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

На данный момент я создаю систему новостей и комментариев, но сейчас я застрял в одной части. Я хочу, чтобы пользователи могли ссылаться на других игроков в стиле Twitter, например, на имя пользователя . Скрипт будет выглядеть примерно так: (не настоящий PHP, просто сценарий воображения, 3)

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

И это для всех @ имя пользователя в строке, возможно, с помощью while (). Я застрял, пожалуйста, помогите.

Solutions Collecting From Web of "Проверьте слово после символа '@' в PHP"

Здесь появляются регулярные выражения .

 <?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 обозначает символ слова , который включает az , AZ , 0-9 и _ .
  3. (?<!\w)@ немного продвинутый, но он называется отрицательным утверждением lookbehind и означает «An @ , который не следует за символом слова». Это значит, что вы не включаете такие вещи, как адреса электронной почты.
  4. \w+ означает «один или несколько символов слова». + Известен как квантификатор .
  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 …