如何替换我知道开头和结尾的字符串中的单词,而不是整个单词?即:将ID#转换为名称

时间:2019-05-22 18:50:38

标签: php regex

我正在为创建的Discord机器人创建Web界面。我目前将所有用户帐户,消息等存储在SQL数据库中,以便Web界面可以包含大量日志供Mod使用。我目前正在尝试提出一种解决方案,用于查看消息时将“ Discord Mentions”转换为可读名称。

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

A)专门抓住所有以<@开头的单词!并以>结尾,以便能够获取查询的ID和 B)替换上面的<@!12345etc>,一旦我知道如何做A,就很容易做。

为澄清起见,我并不是在寻求有关SQL查询的帮助,而只是在寻求帮助以获取使用<@表示统计信息的整个单词!并以字符串/段落中的>结尾。

我对regex感到很糟糕,因此希望有一种无需它就能工作的解决方案。您提供的任何提示将不胜感激。

TLDR:

示例字符串:

“嘿<@!123456789>谢谢你,我很快就会回复你。”

如何获取以<@开头的整个单词!并以>结束,以便能够对其进行SQL查询,然后在以后进行replace()。

我考虑过用空格将字符串分解,然后一次遍历每个单词,然后检查每个单词的startswith和endswith,但是如果消息作者在提及和文本的其余部分之间没有留出空格,不行。

2 个答案:

答案 0 :(得分:1)

如果我正确理解了这一点,则需要“ <@!”之间的所有值。和“>”。话虽如此,我相信您所需要的只是这个/<@!(.+)>/g

demo

答案 1 :(得分:0)

您可以这样做:

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

正则表达式说明:

  

(?<=<@!)向后寻找<@!。这开始比赛

     

.+?与任意字符多次匹配,直到下一次超前。

     

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

使用前瞻性和后向性与常规/<@!(.+?)>之间的区别是它们生成的matches数组。

解决方案不包括在匹配组中,并且导致仅包含所有匹配组的数组数组(“ 12345678”)。

在环视中不包装开始<@!和结束>会导致包含正则表达式模式匹配(“ <@!12345678>”和匹配组(“ 12345678” )。因此,您必须从结果数组中提取匹配的组。