У меня есть следующая строка из формы …
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
)