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