PHP взорвать термины в массиве, сохранить цитируемый текст как единый элемент массива

У меня есть следующая строка из формы …

Opera добавляет кросс-платформенное оборудование »« kicks butt »-hippies

В общем, я просто использовал следующее …

$p0 = explode(' ',$string); 

Однако теперь я хочу поддерживать любые и все операторы цитат как один элемент массива вместо того, чтобы создавать отдельные элементы, такие как "adds , cross-platform и hardware" .

Я хочу, чтобы эта строка в конечном итоге создала такой массив …

 Array ( [0] => 'Opera', [1] => 'adds cross-platform hardware', [2] => 'kicks butt', [3] => '-hippies' ) 

Обычно я предпочитаю не использовать регулярное выражение для большинства вещей, когда это возможно.

Вы можете использовать preg_match_all(...):

 $text = 'Opera "adds cross-platform hardware" "kicks butt" -hippies'; preg_match_all('/"(?:\\\\.|[^\\\\"])*"|\S+/', $text, $matches); print_r($matches); 

Если вы используете PHP> = 5.3, вы можете использовать str_getcsv

 print_r(str_getcsv('Opera "adds cross-platform hardware" "kicks butt" -hippies'," ")); 

печать

 Array ( [0] => Opera [1] => adds cross-platform hardware [2] => kicks butt [3] => -hippies ) 

попробуйте это, не используя регулярное выражение, грубый код

 <? $string='Opera "adds cross-platform hardware" "kicks butt" -hippies'; $g=explodeMe($string); echo "<pre>"; print_r($g); echo "</pre>"; function explodeMe($string){ $k=explode('"',$string); foreach ($k as $key => $link) { if ($k[$key] == ' ') { unset($k[$key]); } } return array_values($k); } ?> с <? $string='Opera "adds cross-platform hardware" "kicks butt" -hippies'; $g=explodeMe($string); echo "<pre>"; print_r($g); echo "</pre>"; function explodeMe($string){ $k=explode('"',$string); foreach ($k as $key => $link) { if ($k[$key] == ' ') { unset($k[$key]); } } return array_values($k); } ?> 

В то время как я ищу самый быстрый подход, я думал, что добавлю свой подход к вызову.

 <?php $q = 'Opera "adds cross-platform hardware" "kicks butt" -hippies'; echo '<div>'.$q.'</div>'; $p0 = explode(' ',$q); echo '<div><pre>';print_r($p0);echo '</pre></div>'; $open = false; $terms = array(); foreach ($p0 as $key) { if ($open==false) { if (substr($key,0,1)=='"') { $open = $key; } else {array_push($terms,$key);} } else if (substr($key,strlen($key) - 1,strlen($key))=='"') { $open = $open.' '.$key; array_push($terms,$open); $open = false; } else { $open = $open.' '.$key; } } echo '<div><pre>';print_r($terms);echo '</pre></div>'; echo '<div><pre>';print_r($open);echo '</pre></div>'; ?> 

Выводит следующие …

Opera добавляет кросс-платформенное оборудование »« kicks butt »-hippies

// Исходные взрывы пробелами …

Массив (

 [0] => Opera [1] => "adds [2] => cross-platform [3] => hardware" [4] => "kicks [5] => butt" [6] => -hippies 

)

// Конечные результаты …

Массив (

 [0] => Opera [1] => "adds cross-platform hardware" [2] => "kicks butt" [3] => -hippies 

)