我正在尝试使用预定义的命令创建一个简单的基于语音的命令界面。我遇到问题的具体部分是程序试图理解用命令传递的参数。我有一些工作代码,但它不适合我想要的。
例如,我可能有一个检查天气的命令如下:
伦敦英国的天气是什么
并且要识别的模式是:
在_天气是什么
我已经获得了一些基于相关性的mysql查询的命令,这不是我的问题,我的问题是从命令中分离出“伦敦联合王国”的背景。
我目前有一些工作代码,但这并不理想:
//SPLIT CONTEXT FROM COMMAND
$query = "in london what is the weather";
$trigger = "in _ what is the weather";
$triggers = explode("_", $trigger);
foreach($triggers as $word){
$query = str_replace($word, "'", $query);
}
$query = explode("'", $query);
array_shift($query);
这意味着$ query ['0'] =“伦敦”。但它一次只能支持一个单词,有没有办法支持多个单词,通过某种方式将其视为一个变量或类似的东西?
TL;博士
干杯
答案 0 :(得分:1)
您可以替换"模式中的_
"与(.+?)
要捕获字符串的结尾,您可以使用(.+)
。你的方式也有效,但效率较低。默认情况下+
(和*
)是贪婪的(添加?
以使其非贪婪),因此它们会一直到最后(如果需要,可以回溯到最后)匹配,永远不会发生,因为它是正则表达式的结束。)
您的PHP代码可能如下所示:
$re = "~in (.+?) what is the (.+)~i";
$str = "in london united kingdom what is the weather";
preg_match($re, $str, $matches);
i
修饰符可确保它不区分大小写(如果您的字符串已全部小写,则不必如您所说)。它将匹配:
IN RUSSIA WHAT IS THE WEATHER
当然,匹配对拼写错误很敏感。它不匹配:
In london united kingdom what is the whether
虽然很难识别短语的所有拼写错误的排列,但您可以考虑一些常见的缩写:
in (.+?) what.*?s the (.+)
那将匹配:
in paris, france whats the weather
和 in poland what's the weather
以及其他一些变体。它不是非常复杂,也会匹配in my backyard what changes the weather
。