0

数据样本$string = '"word","foo","bar","foobar","barfoo"';

在我只使用这些之前:

str_replace('"','',$string) 
explode(',',$string)

我删除了所有引号并继续用逗号分隔它们,但后来我看到了数据样本:

$string = '"word","foo","bar","foobar","bar,foo"';

由于我依靠逗号来获取数据,所以我的代码会出错。

是否有一个 php 函数可以获取两个给定字符内的子字符串?或者如果没有,关于我需要哪些功能才能正确执行此操作的任何建议?

4

4 回答 4

2

对于 PHP >=5.3

有一个名为str_getcsv()的函数用于将 CSV 字符串解析为数组。如果您"的字符串中有 char(请参阅foo""bar参考资料),这也适用,简单的正则表达式将失败;或者您没有引号/附件(请参阅 参考资料word)。

代码:

$string = 'word,"foo","bar","foo""bar","bar,foo"';
print_r( str_getcsv($string) );

输出:

Array
(
    [0] => word
    [1] => foo
    [2] => bar
    [3] => foo"bar
    [4] => bar,foo
)

对于 PHP < 5.3

来自str_getcsv()评论的一个小修改示例(参见其他示例)区域:

function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\') {
    $handle = fopen('php://memory', 'rw');
    fwrite($handle, $input);
    fseek($handle, 0);
    $data = fgetcsv($handle, 4096, $delimiter, $enclosure, $escape);
    fclose($handle);
    return $data;
}
于 2013-09-12T06:25:39.117 回答
1

您可以使用 preg_match_all() 函数:

$string = '"word","foo","bar","foobar","bar,foo"';
$pattern = '#"(.*?)"#';
preg_match_all($pattern, $string, $matches);
print_r($matches[1]);

Array
(
    [0] => word
    [1] => foo
    [2] => bar
    [3] => foobar
    [4] => bar,foo
)

或者如果您想匹配所有单词:

$pattern = '#([^",]+)#';
preg_match_all($pattern, $string, $matches);
print_r($matches[1]);

Array
(
    [0] => word
    [1] => foo
    [2] => bar
    [3] => foobar
    [4] => bar
    [5] => foo
)
于 2013-09-12T06:27:30.787 回答
1

自 PHP 5.3.0 起,函数 str_getcsv() 可用。

对于较低版本的 PHP,您可以使用以下内容:

if (!function_exists('str_getcsv')) {

    function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = null, $eol = null) {
        $temp = fopen("php://memory", "rw");
        fwrite($temp, $input);
        fseek($temp, 0);
        $r = array();
        while (( $data = fgetcsv($temp, 4096, $delimiter, $enclosure)) !== false) {
            $r[] = $data;
        }
        fclose($temp);
        return $r;
    }

}

但要小心函数 str_getcsv - 如果外壳是 " 测试它在这种情况下:

$string = '"wo"rd","fo"o","b"ar","fo"obar","ba"rfoo"';

我认为在将数据与 str_getcsv() 函数一起使用之前,必须先转义数据中的引号。

编辑

我做了一些测试:

$str1 = '"wo"rd","foo"';
$str2 = '"wo""rd","foo"';
$str3 = '"wo\"rd","foo"';

$test_arr1 = str_getcsv($str1);
$test_arr2 = str_getcsv($str2);
$test_arr3 = str_getcsv($str3);

print_r($test_arr1);
print_r($test_arr2);
print_r($test_arr3);

输出是:

数组( [0] => word" [1] => foo )

数组( [0] => wo"rd [1] => foo )

数组( [0] => wo\"rd [1] => foo )

结核病

于 2013-09-12T06:39:02.700 回答
0

","在删除开始和结束分隔符后,您可以改为拆分。

$trimmed_string = trim($string, '\'"');
explode('","',$trimmed_string);
于 2013-09-12T06:30:27.550 回答