PHP-从字符串中提取自定义运算符

PHP-从字符串中提取自定义运算符,php,Php,我有一个通过PHP搜索的MySQL数据库后端。我正在尝试实现用于详细搜索的自定义运算符。 以下是一个例子: $string = "o:draw t:spell card"; 其中o:=按描述搜索,而t:=卡片键入。这类似于来自Scryfall这样的站点的自定义语法 以下是我正在进行的o: $string = "o:draw t:spell card"; if (strpos($string, 'o:') !== false) { $text = explode('o:

我有一个通过PHP搜索的MySQL数据库后端。我正在尝试实现用于详细搜索的自定义运算符。 以下是一个例子:

$string = "o:draw t:spell card";
其中
o:
=按描述搜索,而
t:
=卡片键入。这类似于来自Scryfall这样的站点的自定义语法

以下是我正在进行的
o:

$string = "o:draw t:spell card";

    if (strpos($string, 'o:') !== false) {
        $text = explode('o:', $string, 2)[1];
        echo $text;
    }
输出为:
draw t:spell card

我试图让输出只响应:
draw

然而,它还需要能够“巧妙地”完成这一任务。它可能并不总是以特定的顺序出现,可能会与其他运营商一起出现

关于如何在PHP中构建这样的系统,有什么建议吗

用户搜索示例:

搜索描述+类型(新语法):

o:draw a card t:spell card
Time Wizard
Draw a Card
Time Wizard t:effect monster
搜索卡片名称/描述(当前功能):

o:draw a card t:spell card
Time Wizard
Draw a Card
Time Wizard t:effect monster
搜索卡片名称/描述(当前功能):

o:draw a card t:spell card
Time Wizard
Draw a Card
Time Wizard t:effect monster
新旧语法的组合:

o:draw a card t:spell card
Time Wizard
Draw a Card
Time Wizard t:effect monster

您可以像下面这样从字符串中提取键值

$tags = ['o:', 't:'];

$str = "t:spell card o:draw a card";

$dataList = [];
foreach($tags as $tag){
    $tagDataLevel1 = explode($tag, $str, 2)[1];
    $expNew = explode(':', $tagDataLevel1,2);
    if(count($expNew)==2){
        $tagData= strrev(explode(' ',strrev($expNew[0]),2)[1]);
    }else{
        $tagData = $tagDataLevel1;
    }

    $dataList[$tag] = $tagData;
   //overwrite string
    $str = str_replace($tag . $tagData,"",$str);

}

$oldKeyWord = $str;

var_dump ($dataList);
echo $oldKeyWord;

您可以像下面这样从字符串中提取键值

$tags = ['o:', 't:'];

$str = "t:spell card o:draw a card";

$dataList = [];
foreach($tags as $tag){
    $tagDataLevel1 = explode($tag, $str, 2)[1];
    $expNew = explode(':', $tagDataLevel1,2);
    if(count($expNew)==2){
        $tagData= strrev(explode(' ',strrev($expNew[0]),2)[1]);
    }else{
        $tagData = $tagDataLevel1;
    }

    $dataList[$tag] = $tagData;
   //overwrite string
    $str = str_replace($tag . $tagData,"",$str);

}

$oldKeyWord = $str;

var_dump ($dataList);
echo $oldKeyWord;

我无法将您的输入一直带到sql字符串,因为我不知道您要访问的列是否比您在问题中列出的两个多

要开始为用户的输入编写解析器脚本,您需要了解您希望容纳的所有可能输入,并为每个事件分配特定的处理程序。这个任务有能力变成一个兔子洞——换句话说,它可能成为一个不断扩展和发散的任务。我的答案只是让你开始;我不会长期从事这项工作

  • 声明要遵守的命令的白名单。在我的代码片段中,这是
    $commands
    。具有特殊含义的字符串白名单不能与任何卡片名称字符串混淆——我添加了在YuGiOh数据库(包含冒号的卡片名称)中可以找到的最好的边缘大小写
  • 使用白名单构建正则表达式模式,以在输入字符串中查找符合条件的分隔空间
  • 迭代regex split输入生成的数组,并评估每个元素,以确定是否/如何将其集成到sql的WHERE子句中
  • 在这个早期阶段,每个输入字符串只允许一个卡片名称是公平的,但用户可能希望输入多个卡片类型以过滤其预期结果集
  • 我选择通过修剪前导和尾随空格并将所有字母转换为小写来清理用户输入。我假设您将运行一个现代数据库,它将进行不区分大小写的比较

    代码:()


    我无法将您的输入一直带到sql字符串,因为我不知道您要访问的列是否比您在问题中列出的两个多

    要开始为用户的输入编写解析器脚本,您需要了解您希望容纳的所有可能输入,并为每个事件分配特定的处理程序。这个任务有能力变成一个兔子洞——换句话说,它可能成为一个不断扩展和发散的任务。我的答案只是让你开始;我不会长期从事这项工作

  • 声明要遵守的命令的白名单。在我的代码片段中,这是
    $commands
    。具有特殊含义的字符串白名单不能与任何卡片名称字符串混淆——我添加了在YuGiOh数据库(包含冒号的卡片名称)中可以找到的最好的边缘大小写
  • 使用白名单构建正则表达式模式,以在输入字符串中查找符合条件的分隔空间
  • 迭代regex split输入生成的数组,并评估每个元素,以确定是否/如何将其集成到sql的WHERE子句中
  • 在这个早期阶段,每个输入字符串只允许一个卡片名称是公平的,但用户可能希望输入多个卡片类型以过滤其预期结果集
  • 我选择通过修剪前导和尾随空格并将所有字母转换为小写来清理用户输入。我假设您将运行一个现代数据库,它将进行不区分大小写的比较

    代码:()


    如果不将“旧”名称/描述的位置限制在搜索的开始,我不知道如何才能做到这一点。如果它可以在任何地方,那么您需要某种分隔符来指示运算符值停止的位置,“常规”输入开始的位置,反之亦然。这个问题定义不清,悬赏将吸引低质量的答案,而这些答案只是试图给它一个下注。请彻底检查您的问题,提供足够的输入样本(如10或20个)和准确的预期结果。您需要确定(在样本输入中)所有需要满足的边缘情况。我们希望看到混合语法、重新排序的语法以及任何可能导致麻烦的东西。@GenesisBits这是您期望的行为吗@GenesisBits或者,这也是一样的:您实际上需要如何为查询准备这些数据?还有哪些附带的情况必须考虑?我只想指出@mickmackusa提供的代码只适用于单字符运算符(例如,必须修改为“atk”或“def”)。如果你想得到一个完整的答案,你真的应该用完整的要求和更多的例子来更新这个问题。如果不把“旧”名称/描述的位置限制在搜索的开始,我不知道如何才能做到这一点。如果它可以在任何地方,那么您需要某种分隔符来指示运算符值停止的位置和“常规”输入开始的位置,反之亦然_