Google运营商的正则表达式

Ada*_*dam 4 php regex

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

  • keyword = natural/default
  • "关键字"或"搜索词组"=完全匹配
  • 关键字*=部分匹配

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

正则表达式将为以下字符串实现此目的?


示例字符串($ string)

今天我正在"尝试"一个*"谷歌搜索""测试"

期望的结果

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

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

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

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

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

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

Gum*_*mbo 5

您可以使用strtok标记化字符串.

例如,请参见手册页上的注释中从此tokenizeQuoted函数派生的此tokenizedQuoted函数strtok:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

这是一个使用示例:

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

输出:

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*"
  }
}
Run Code Online (Sandbox Code Playgroud)