Мне нужно проанализировать строку поиска для ключевых слов и фраз в 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, ' ', '"');