我如何替换一个我知道开始和结束的字符串中的单词,但不是整个单词?IE:将ID#转换为名称



我正在为我创建的Discord Bot创建一个Web界面。我当前将所有用户帐户,消息等存储在SQL数据库中,以便Web界面可以使用大量的日志供MOD使用。我目前正在尝试在查看消息转换为可读名称时提出一个解决方案。

例如,当某人在消息中标记/提及另一个用户时,而不是存储'@name'it存储'<@!12345678>''。基于该文本以<@开头的方式!我知道它正在链接用户名,在其中我可以访问包含所有用户以检索其纯文本名称的SQL表,但我不确定如何:

a(特别抓住任何以<@开始的单词!并以>>能够抓住查询的ID和b(替换上述<@!12345etc>,一旦我知道如何做a。

只是为了澄清,我不是在寻找SQL查询的帮助,而只是在寻求帮助,以获取所有与<@的单词!并以>从字符串/段落结束。

我对Regex我很糟糕,因此希望有一个解决方案可以工作而无需它哈哈。您可以提供的任何提示都将不胜感激。

tldr:

样本字符串:

"嘿<@!123456789>谢谢你,我会回到你身边。"

如何获取以<@开头的整个单词!并以>>结尾,以便能够使用它进行SQL查询,然后稍后替换((。

我考虑过用一个空间爆炸字符串,然后一次遍历每个单词,用startswith和endswith检查每个单词't工作。

如果我正确理解了这一点,则需要"&lt;@!"之间的所有值和">"。话虽这么说,我相信您所需要的就是这个/<@!(.+)>/g

demo

您可以这样做:

<?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

正则说明:

(?<=<@!)看起来宾夕法尼亚州查找<@!。这开始比赛

.+?在下一个lookahead之前匹配任意任何次数。

(?=>)匹配在找到>时结束(但不包括在比赛中(

使用LookAheads和LookBehinds和常规/<@!(.+?)>之间的区别是它们产生的matches数组。

求和组不包含在匹配组中,并在包含所有匹配组的一系列数组中(仅12345678&quot of(。

不要将启动<@!和End >包装在外观中导致一系列包含REGEX模式匹配的数组("&lt;@!12345678&gt;将必须从结果阵列中提取匹配组。

最新更新