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