字符串

时间:2016-04-11 15:44:20

标签: php regex preg-match

我正在尝试使用预定义的命令创建一个简单的基于语音的命令界面。我遇到问题的具体部分是程序试图理解用命令传递的参数。我有一些工作代码,但它不适合我想要的。

例如,我可能有一个检查天气的命令如下:

  

伦敦英国的天气是什么

并且要识别的模式是:

  

在_天气是什么

我已经获得了一些基于相关性的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;博士

  • 用于分隔参数的代码
  • 多个单词
  • 将其分隔为字符串

干杯

1 个答案:

答案 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