взорвать строку в токенах, сохраняя цитируемые субстраты

Я не знаю, где я это видел, но может ли кто-нибудь сказать мне, как это сделать, используя php и regex?

'this is a string "that has quoted text" inside.' 

я хочу быть в состоянии взорвать его вот так

 [0]this [1]is [2]a [3]string [4]"that has quoted text" [5]inside 

сохраняя котировки неповрежденными.

Вы можете попробовать следующий код:

 $str = 'this is a string "that has quoted text" inside.'; var_dump ( preg_split('#\s*("[^"]*")\s*|\s+#', $str, -1 , PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) ); Output: array(6) { [0]=> string(4) "this" [1]=> string(2) "is" [2]=> string(1) "a" [3]=> string(6) "string" [4]=> string(22) ""that has quoted text"" [5]=> string(7) "inside." } 

Вот ссылка на выше действующий код на dialpad

Обновление: для поддержки поддержки попробуйте:

 preg_split('#\s*((?<!\\\\)"[^"]*")\s*|\s+#', $str, -1 , PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 

Требуется PHP> = 5.3.0

 $str = 'this is a string "that has quoted text" inside'; $x = str_getcsv($str,' ','"'); var_dump($x); 

Это разделяет кавычки, но не оставляет содержимое блокированного кавычки.

Это работает на regexpal.com с вашей примерной строкой:

((".*?")|([\S]*))

Если вам не обязательно нужно регулярное выражение, вы также можете использовать strtok для tokenize строки. См. tokenizedQuoted функцию tokenizedQuoted в комментариях на странице руководства strtok и моем улучшении этой функции tokenizedQuoted для некоторых примеров.

Это требует обратной связи и поискать вперед …

Попробуйте что-нибудь вроде:

 preg_split('/(?<!(".+)) (?!(.+"))/', $str, -1 ,PREG_SPLIT_NO_EMPTY); 

[не испытано]