Я не знаю, где я это видел, но может ли кто-нибудь сказать мне, как это сделать, используя 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);
[не испытано]