PHP将术语分解到数组中,将引用的文本保留为单个数组项


PHP explode terms in to array, retain quoted text as single array item

我有一个表单中的以下字符串…

Opera"增加跨平台硬件"踢屁股"-嬉皮士

一般来说,我只是使用了以下。。。

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

但是,现在我想将任何和所有引号运算符维护为单个数组项,而不是让它们创建单独的项,如"addscross-platformhardware"

我想让这个字符串最终创建一个这样的数组。。。

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

我通常不喜欢在任何可能的情况下对大多数事情使用regex。

您可以使用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
)

在不使用regex的情况下尝试此操作,regex是一个粗略的代码

<?
$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);
}
?>

当我在寻找最快的方法时,我想我应该在challenge中添加我自己的方法。

<?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>';
?>

输出以下内容。。。

歌剧";增加了跨平台硬件"踢屁股"-嬉皮士

//按空格进行初始爆炸。。。

阵列(

[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

)