Как запросить preg_match_all результаты в цикле foreach?

Поэтому я работаю над системой пользовательских тегов, такой как твиттер, где пользователи могут добавлять теги друг к другу в комментариях примерно так: «blablabla @username blablabla». Я использую preg_replace, чтобы найти и преобразовать «@username» в тексте в интерактивную ссылку, и preg_match_all при вставке в базу данных.

$text = preg_replace('/(^|\s)@(\w+)/', '$1<a href="profile.php?poet_id=$2" class="small">@$2</a>', $text);

А также

    $sanitized_comment = trim(mysql_real_escape_string(htmlspecialchars($_POST['comment'])));

if (preg_match_all("/(^|\s)@(\w+)/", $sanitized_comment, $matches)) {
$mentions = array_unique($matches[0]);

foreach($mentions as $mention) {
mysql_query("INSERT INTO `comments_mentions` SET `cm_comment_id` = @last_comment_id, `cm_mentioned` = '" . $mention . "', `cm_mentioner` = " . (int)$session_user_id . "");
}
}

Это отлично работает.

Сейчас я пытаюсь найти и сохранить «user_id» пользователей, помеченных в тексте, вместо их «username».

Я пытался делать

    $sanitized_comment = trim(mysql_real_escape_string(htmlspecialchars($_POST['comment'])));

if (preg_match_all("/(^|\s)@(\w+)/", $sanitized_comment, $matches)) {
$mentions = array_unique($matches[0]);

foreach($mentions as $mention) {
$user_id_from_username = mysql_fetch_assoc(mysql_query("SELECT `user_id` FROM `users` WHERE lower(`username`) = lower(substr('" . $mention . "', 2))"));
mysql_query("INSERT INTO `comments_mentions` SET `cm_comment_id` = @last_comment_id, `cm_mentioned` = " . $user_id_from_username . ", `cm_mentioner` = " . (int)$session_user_id . "");
}
}

Но это только вставляет одну строку (первое значение) в базу данных, даже если несколько человек были помечены.

Как правильно запросить «user_id» каждого упомянутого пользователя «username», а затем сохранить эти идентификаторы в строках (несколько, если несколько человек были помечены) в моей базе данных?

1

Решение

Пытаться var_dump($matches) до $mentions = array_unique($matches[0]);, Я не уверен, но я ожидаю, что имена пользователей будут храниться в $matches[2],

Вы могли бы также дать (\w+) имя, чтобы сделать вещи проще. Шаблон должен выглядеть примерно так:

/(^|\s)@(?P<username>\w+)/

При выполнении preg_match_all Вы можете получить имена пользователей, как это:

$mentions = array_unique($matches['username']);

И что @CharlotteDunois сказал в комментарии. С помощью mysql плохо. Используйте PDO или mysqli.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]