На данный момент я создаю систему новостей и комментариев, но сейчас я застрял в одной части. Я хочу, чтобы пользователи могли ссылаться на других игроков в стиле Twitter, например, на имя пользователя . Скрипт будет выглядеть примерно так: (не настоящий PHP, просто сценарий воображения, 3)
$string = "I loved the article, @SantaClaus, thanks for writing!"; if($string contains @){ $word = word after @; $check = is word in database? ... } 
И это для всех @ имя пользователя в строке, возможно, с помощью while (). Я застрял, пожалуйста, помогите.
Здесь появляются регулярные выражения .
 <?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 } } ?> 
\w обозначает символ слова , который включает az , AZ , 0-9 и _ . (?<!\w)@ немного продвинутый, но он называется отрицательным утверждением lookbehind и означает «An @ , который не следует за символом слова».  Это значит, что вы не включаете такие вещи, как адреса электронной почты. \w+ означает «один или несколько символов слова».  + Известен как квантификатор . \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 …