像gmail搜索运算符一样的正则表达式 - PHP preg_match

时间:2011-02-04 10:42:18

标签: regex search gmail

我正在尝试使用PHP中的函数preg_match来实现类似于gmail搜索运算符的系统,以分割输入字符串。 例如:

输入字符串 => command1:word1 word2 command2:word3 command3:word4 wordN
输出数组 => (
command1:word1 word2,
命令2:WORD3,
command3:word4 wordN

以下文章介绍了如何执行此操作:Implementing Google search operators

我已经使用preg_match测试它但不匹配。我认为正则表达式可能会在系统之间发生一些变化 有人猜测PHP中的正则表达式如何匹配这个问题?

preg_match('/\s+(?=\w+:)/i','command1:word1 word2 command2:word3 command3:word4 wordN',$test); 

谢谢,

1 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

<?php
$input = 'command1:word1 word2 command2:word3 command3:word4 wordN command1:word3';
preg_match_all('/
  (?:
    ([^: ]+) # command
    : # trailing ":"
  )
  (
    [^: ]+  # 1st word
    (?:\s+[^: ]+\b(?!:))* # possible other words, starts with spaces, does not end with ":"
  )
  /x', $input, $matches, PREG_SET_ORDER);

$result = array();
foreach ($matches as $match) {
  $result[$match[1]] = $result[$match[1]] ? $result[$match[1]] . ' ' . $match[2] : $match[2];
}

var_dump($result);

它甚至可以处理不同位置的相同命令(例如,在开头和结尾都有“command1:”)。