PHP-从字符串中提取自定义运算符
我有一个通过PHP搜索的MySQL数据库后端。我正在尝试实现用于详细搜索的自定义运算符。 以下是一个例子: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:
$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数据库(包含冒号的卡片名称)中可以找到的最好的边缘大小写我无法将您的输入一直带到sql字符串,因为我不知道您要访问的列是否比您在问题中列出的两个多 要开始为用户的输入编写解析器脚本,您需要了解您希望容纳的所有可能输入,并为每个事件分配特定的处理程序。这个任务有能力变成一个兔子洞——换句话说,它可能成为一个不断扩展和发散的任务。我的答案只是让你开始;我不会长期从事这项工作
$commands
。具有特殊含义的字符串白名单不能与任何卡片名称字符串混淆——我添加了在YuGiOh数据库(包含冒号的卡片名称)中可以找到的最好的边缘大小写如果不将“旧”名称/描述的位置限制在搜索的开始,我不知道如何才能做到这一点。如果它可以在任何地方,那么您需要某种分隔符来指示运算符值停止的位置,“常规”输入开始的位置,反之亦然。这个问题定义不清,悬赏将吸引低质量的答案,而这些答案只是试图给它一个下注。请彻底检查您的问题,提供足够的输入样本(如10或20个)和准确的预期结果。您需要确定(在样本输入中)所有需要满足的边缘情况。我们希望看到混合语法、重新排序的语法以及任何可能导致麻烦的东西。@GenesisBits这是您期望的行为吗@GenesisBits或者,这也是一样的:您实际上需要如何为查询准备这些数据?还有哪些附带的情况必须考虑?我只想指出@mickmackusa提供的代码只适用于单字符运算符(例如,必须修改为“atk”或“def”)。如果你想得到一个完整的答案,你真的应该用完整的要求和更多的例子来更新这个问题。如果不把“旧”名称/描述的位置限制在搜索的开始,我不知道如何才能做到这一点。如果它可以在任何地方,那么您需要某种分隔符来指示运算符值停止的位置和“常规”输入开始的位置,反之亦然_