регулярное выражение, как операторы поиска Gmail - PHP preg_match - PullRequest
1 голос
/ 04 февраля 2011

Я пытаюсь реализовать систему, похожую на операторы поиска в Gmail, используя функцию preg_match из PHP для разделения входной строки.Пример:

строка ввода => команда1: слово1 слово2 команда2: слово3 команда3: слово4 словоN
выходной массив => (
команда1: слово1 слово2,
command2: word3,
command3: word4 wordN
)

В следующем посте объясняется, как это сделать: Реализация операторов поиска Google

Я уже тестировал его, используя preg_match, но не соответствует.Я думаю, что регулярные выражения могут немного измениться от системы к системе.
Есть предположения, как регулярное выражение в PHP будет соответствовать этой проблеме?

preg_match('/\s+(?=\w+:)/i','command1:word1 word2 command2:word3 command3:word4 wordN',$test); 

Спасибо,

1 Ответ

2 голосов
/ 07 февраля 2011

Вы можете использовать что-то вроде этого:

<?php
$input = 'command1:word1 word2 command2:word3 command3:word4 wordN command1:word3';
preg_match_all('/
  (?:
    ([^: ]+) # command
    : # trailing ":"
  )
  (
    [^: ]+  # 1st word
    (?:\s+[^: ]+\b(?!:))* # possible other words, starts with spaces, does not end with ":"
  )
  /x', $input, $matches, PREG_SET_ORDER);

$result = array();
foreach ($matches as $match) {
  $result[$match[1]] = $result[$match[1]] ? $result[$match[1]] . ' ' . $match[2] : $match[2];
}

var_dump($result);

Он будет справляться даже с одними и теми же командами в разных местах (например, «command1:» в начале и в конце).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...