2010-09-28 2 views
4

Используя PHP, я пытаюсь улучшить поиск на своем сайте, поддерживая Google, например, операторов, например.Регулярные выражения для операторов Google

  • ключевого слова = натуральное/по умолчанию
  • «ключевое слово» или «поиск фразы» = точное соответствие
  • ключевого слова * = частичное совпадение

Для этой работу мне нужно разбить строку в два массива. Один для точных слов (но без двойных кавычек) в $ Array1() и помещает все остальное (естественные и частичные ключевые слова) в Array2().

Какие регулярные выражения достигнут этого для следующей строки?


Пример строки ($ строка)

сегодня я "пытается" из а * "Google Search" "тест"

Желаемая результат

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

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

1) Exact Я пробовал следующее для точного regexp, но он возвращает два массива, один с одним и без двойных кавычек. Я мог бы просто использовать $ 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"' 
); 

ответ

5

Вы можете использовать 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*" 
    } 
} 
+0

Гамб, спасибо! Это отлично работает для меня. Я не знал о strtok(), и это отличное решение. – Adam

+0

Это тоже помогло мне. +1 – Dutchie432

Смежные вопросы