Мне нужно проанализировать строку поиска для ключевых слов и фраз в php, например
 строка 1: value of "measured response" detect goal "method valuation" study 
  даст: value,of,measured reponse,detect,goal,method valuation,study 
Мне также нужно, чтобы он работал, если строка имеет:
  я склоняюсь к использованию preg_match с шаблоном '/(\".*\")/' чтобы получить фразы в массив, а затем удалить фразы из строки, а затем, наконец, '/(\".*\")/' ключевые слова в массиве.  я просто не могу вытащить все вместе! 
  Я также думаю о замене пробелов вне кавычек запятыми.  затем взорвите их в массив.  если это лучший вариант, как мне это сделать с preg_replace ? 
есть ли лучший способ сделать это? Помогите! Большое спасибо всем
 preg_match_all('/(?<!")\b\w+\b|(?<=")\b[^"]+/', $subject, $result, PREG_PATTERN_ORDER); for ($i = 0; $i < count($result[0]); $i++) { # Matched text = $result[0][$i]; } 
Это даст результаты, которые вы ищете.
Объяснение:
 # (?<!")\b\w+\b|(?<=")\b[^"]+ # # Match either the regular expression below (attempting the next alternative only if this one fails) «(?<!")\b\w+\b» # Assert that it is impossible to match the regex below with the match ending at this position (negative lookbehind) «(?<!")» # Match the character “"” literally «"» # Assert position at a word boundary «\b» # Match a single character that is a “word character” (letters, digits, etc.) «\w+» # Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» # Assert position at a word boundary «\b» # Or match regular expression number 2 below (the entire match attempt fails if this one fails to match) «(?<=")\b[^"]+» # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind) «(?<=")» # Match the character “"” literally «"» # Assert position at a word boundary «\b» # Match any character that is NOT a “"” «[^"]+» # Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
 $s = 'value of "measured response" detect goal "method valuation" study'; preg_match_all('~(?|"([^"]+)"|(\S+))~', $s, $matches); print_r($matches[1]); 
вывод:
 Array ( [0] => value [1] => of [2] => measured response [3] => detect [4] => goal [5] => method valuation [6] => study ) 
  Трюк здесь заключается в использовании группы сброса-сброса : (?|...|...) .  Это похоже на чередование, содержащееся в группе без захвата – (?:...|...) за исключением того, что внутри каждой ветви номера группы захвата начинаются с того же номера.  (Для получения дополнительной информации см. Документы PCRE и поиск DUPLICATE SUBPATTERN NUMBERS .) 
  Таким образом, интересующий нас текст всегда захватывает группу # 1.  Вы можете получить содержимое группы # 1 для всех матчей через $matches[1] .  (Предполагается, что установлен флаг PREG_PATTERN_ORDER, я не указал его, как @FailedDev, потому что он по умолчанию. Подробнее см. В документах PHP .) 
  Нет необходимости использовать регулярное выражение, встроенная функция str_getcsv может использоваться для str_getcsv строки с любыми разделителями, оболочками и escape-символами. 
На самом деле это так просто.
 // where $string is the string to parse $array = str_getcsv($string, ' ', '"');