【问题标题】:Regular expressions for Google operatorsGoogle 运算符的正则表达式
【发布时间】:2010-09-28 09:45:53
【问题描述】:

使用 PHP,我正在尝试通过支持类似 Google 的运算符来改进我网站上的搜索,例如

  • 关键字 = 自然/默认
  • “关键字”或“搜索词组”= 完全匹配
  • 关键字* = 部分匹配

为此,我需要将字符串拆分为两个数组。一个用于准确的单词(但没有双引号)放入 $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) 自然/部分 以下规则返回正确的关键字,但带有几个空白值。这个正则表达式规则可能很草率,还是我应该通过 array_filter() 运行数组?

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

【问题讨论】:

    标签: php regex


    【解决方案1】:

    您可以使用strtok 对字符串进行标记。

    例如看这个tokenizeQuoted函数派生自这个tokenizedQuoted function in the comments on the strtok manual page

    // 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*"
      }
    }
    

    【讨论】:

    • 秋葵,谢谢!这对我很有用。我不知道 strtok() ,这是一个很好的解决方案。
    • 这也帮了我很多忙。 +1
    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多