Как мне заменить слово в строке, с которой я знаю начало и конец, но не все слово?Т.е.: преобразование ID # в имя - PullRequest
1 голос
/ 22 мая 2019

Я создаю веб-интерфейс для созданного мной бота Discord. В настоящее время я храню все учетные записи пользователей, сообщения и т. Д. В базе данных SQL, чтобы в веб-интерфейсе могли быть обширные журналы для использования модов. В настоящее время я пытаюсь найти решение для преобразования сообщений, чтобы преобразовать «Discord Mentions» в читаемые имена.

Например, когда кто-то помечает / упоминает другого пользователя в сообщении, вместо SQL, хранящего «@name», он хранит «<@! 12345678>». На основании того, как этот текст начинается с <@! Я знаю, что это связывает имя пользователя, в котором я могу получить доступ к таблице SQL, содержащей всех пользователей, для получения их простого текстового имени, но я не уверен, как: </p>

A) В частности, берите любые слова, которые начинаются с <@! и заканчивается>, чтобы иметь возможность получить идентификатор для запроса и B) Замените вышеуказанный <@! 12345etc>, что достаточно легко сделать, если я знаю, как это сделать.

Просто для пояснения. Я не ищу помощи в выполнении SQL-запросов, просто ищу помощь в получении всего слова, которое соответствует статистике с помощью <@! и заканчивается символом> из строки / абзаца.

Я ужасно с регулярным выражением, так что, надеюсь, есть решение, которое может работать, не нуждаясь в нем, ха-ха. Будем весьма благодарны за любые советы, которые вы можете дать.

TLDR:

Пример строки:

"Привет <@! 123456789> спасибо за это, я вернусь к тебе, sooon."

Как получить слово целиком, начинающееся с <@! и заканчивается символом>, чтобы можно было выполнить с ним SQL-запрос, а затем заменить ().

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

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Если я правильно понимаю, вы хотите, чтобы все значения были между "<@!"и ">".При этом я считаю, что все, что вам нужно, это /<@!(.+)>/g

демо

0 голосов
/ 23 мая 2019

Вы можете сделать это следующим образом:

<?php

$str = "Hey <@!123456789> thanks for that, I'll get back to you sooon.";    
$re = '/(?<=<@!).+?(?=>)/m';


preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// flatten the array result (otherwise it's an array of arrays)
$matches = array_merge(...$matches);

// Print the entire match result
print_r($matches); //Array ( [0] => 123456789 )

Демонстрация https://3v4l.org/D64Ma

Объяснение регулярного выражения:

(?<=<@!) выглядит за, чтобы найти <@!,Это начинает совпадение

.+? соответствует любому символу любое количество раз до следующего просмотра.

(?=>) совпадение заканчивается, когда найден > (но не включен в совпадение)

Разница между использованием lookaheads и lookbehinds и обычного /<@!(.+?)> заключается в том, что они генерируют массив matches.

Обозначения не включаются в соответствующую группу и приводят к массиву массивов, содержащих только все соответствующие группы ("12345678").

Если не обернуть начало <@! и конец > в результате поиска, получается массив массивов, содержащий оба совпадения с шаблоном регулярного выражения ("<@! 12345678>", а также группу соответствия ("12345678")Таким образом, вам придется извлечь соответствующие группы из полученных массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...