Intereting Posts
Представление формы с использованием запроса даты PHP / MySQL на страницу Google Visualization Как получить все параметры сообщений в Symfony2? Почему строка с одинарными кавычками вызывает ошибку при вставке в БД? Прозрачность изображения и альфа при слиянии изображений с PHP Есть ли какой-либо возможный способ найти название страны, использующей IP-адрес с языком сценариев PHP? Выражение пользователей Windows в PHP? Получайте электронную почту получателю при отправке, а также отправитель Получите отправку с помощью PHPMailer Как публиковать сообщения на своей собственной странице в Facebook? Ajax-вызов возвращает целую страницу, а не только значение эха WordPress: используйте метод = "post" для множественного выбора языка Ошибка API Google Calendar PHP нужны некоторые советы по значению формы Drupal $ php domdocument получает значение узла, где значение атрибута codeigniter: передавать данные в представление, включенное в представление Простое обнаружение входа в PHP SQL

строка поиска синтаксического анализа для фраз и ключевых слов

Мне нужно проанализировать строку поиска для ключевых слов и фраз в php, например

строка 1: value of "measured response" detect goal "method valuation" study

даст: value,of,measured reponse,detect,goal,method valuation,study

Мне также нужно, чтобы он работал, если строка имеет:

  1. никакие фразы, заключенные в кавычки,
  2. любое количество фраз заключает в кавычки с любым количеством ключевых слов вне кавычек,
  3. только фразы в кавычках,
  4. только ключевые слова, разделенные пробелами.

я склоняюсь к использованию 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, ' ', '"');