Google运营商的正则表达式

时间:2010-09-28 09:45:54

标签: php regex

使用PHP,我试图通过支持像运营商这样的运营商来改进我网站上的搜索。

  • keyword = natural / default
  • “keyword”或“搜索词组”=完全匹配
  • keyword * =部分匹配

为此,我需要将字符串拆分为两个数组。一个用于确切单词(但没有双引号)到$ Array1()中并将其他所有内容(自然和部分关键字)放入Array2()。

对于以下字符串,哪些正则表达式会实现此目的?


示例字符串($ string)

  

今天我正在“尝试”*“谷歌搜索”“测试”

期望的结果

$Array1 = array(
  [0]=>trying
  [1]=>google search
  [2]=>testing
);

$Array2 = array(
  [0]=>today
  [1]=>i'm
  [2]=>out
  [3]=>a*
);

1)完全我已经尝试了以下精确的正则表达式,但它返回了两个数组,一个有一个,一个没有双引号。我可以使用$ result [1],但可能有一个我在这里缺少的技巧。

preg_match_all(
    '/"([^"]+)"/iu', 
    'today i\'m "trying" \'out\' a* "google search" "test"', 
    $result
);

2)自然/部分以下规则会返回正确的关键字,但会返回几个空白值。这个regexp规则可能很草率,或者我应该通过array_filter()运行数组?

preg_split(
    '/"([^"]+)"|(\s)/iu', 
    'today i\'m "trying" \'out\' a* "google search" "test"'
);

1 个答案:

答案 0 :(得分:5)

您可以使用strtok来标记字符串。

例如,请参阅从此tokenizedQuoted function in the comments on the strtok manual page派生的此tokenizeQuoted函数:

// split a string into an array of space-delimited tokens, taking double-quoted and single-quoted strings into account
function tokenizeQuoted($string, $quotationMarks='"\'') {
    $tokens = array(array(),array());
    for ($nextToken=strtok($string, ' '); $nextToken!==false; $nextToken=strtok(' ')) {
        if (strpos($quotationMarks, $nextToken[0]) !== false) {
            if (strpos($quotationMarks, $nextToken[strlen($nextToken)-1]) !== false) {
                $tokens[0][] = substr($nextToken, 1, -1);
            } else {
                $tokens[0][] = substr($nextToken, 1) . ' ' . strtok($nextToken[0]);
            }
        } else {
            $tokens[1][] = $nextToken;
        }
    }
    return $tokens;
}

以下是使用示例:

$string = 'today i\'m "trying" out a* "google search" "test"';
var_dump(tokenizeQuoted($string));

输出:

array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(6) "trying"
    [1]=>
    string(13) "google search"
    [2]=>
    string(4) "test"
  }
  [1]=>
  array(4) {
    [0]=>
    string(5) "today"
    [1]=>
    string(3) "i'm"
    [2]=>
    string(3) "out"
    [3]=>
    string(2) "a*"
  }
}