Проверьте слово после символа '@' в PHP
В настоящий момент я создаю систему новостей и комментариев, но сейчас я застрял в одной части. Я хочу, чтобы пользователи могли ссылаться на других игроков в стиле твиттера, например @username. script будет выглядеть примерно так: (не настоящий PHP, просто сценарий воображения, 3)
$string = "I loved the article, @SantaClaus, thanks for writing!";
if($string contains @){
$word = word after @;
$check = is word in database? ...
}
И это для всех @username в строке, возможно, с помощью while(). Я застрял, пожалуйста, помогите.
Ответы
Ответ 1
Здесь регулярные выражения.
<?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 и означает "An @
, который не следует за символом слова". Это значит, что вы не включаете такие вещи, как адреса электронной почты.
-
\w+
означает "Один или несколько символов слова". +
известен как квантификатор.
- Скобки вокруг
\w+
фиксируют часть в скобках и отображаются в $matches
.
regular-expressions.info кажется популярным выбором учебника, но есть много других онлайн.
Ответ 2
Похож на работу для 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);
Ответ 3
Предположим использовать API Twitter для поиска имени пользователя из вашего текста: https://github.com/twitter/twitter-text-js
Ответ 4
Здесь выражение, которое будет соответствовать тому, что вам нужно, но не будет записывать адреса электронной почты:
$str = '@foo I loved the article, @SantaClaus, thanks for writing to [email protected]';
preg_match_all('/(^|[^a-z0-9_])(@[a-z0-9_]+)/i', $str, $matches);
//$matches[2][0] => @foo
///$matches[2][1] => @SantaClause
Как вы можете видеть: [email protected] не захвачен, но строки @foo и @SantaClaus...