2011-02-25 29 views
0

我在寻找一个explode类型的函数,它将按字符分解一个字符串,但如果字符在它们内部,也会取一个字符列表来忽略。分解函数不是分解字符

例如:

$str = "hello, this is, a test 'some, string' thanks"; 
explode_func($str, ",", "'"); 

这会爆炸通过,$str但忽略任何,'

预期输出:

Array 
(
    [0] => hello 
    [1] => this is 
    [2] => a test 
    [3] => thanks 
) 

另一个例子是:

$str = "hello, this is, a test (some, string) thanks"; 
explode_func($str, ",", "()"); 

这会爆炸$str,但忽略()之间的任何,以获得相同的输出。

任何想法?

+0

如何将它处理'你好我的名字是“b'r'i'a'n“':)似乎无论如何都是正则表达式问题 – Quamis 2011-02-25 15:01:09

回答

5

str_getcsv()

$str = "hello, this is, a test 'some, string' thanks"; 
$array = str_getcsv($str, ",", "'"); 

应该给:

Array 
(
    [0] => hello 
    [1] => this is 
    [2] => a test 'some, string' thanks 
) 
+0

只要你有PHP 5.3+ – Rudu 2011-02-25 15:01:58

+0

@rudu - 你的意思是还有人仍在运行早期版本?:) – 2011-02-25 15:02:59

+0

难以相信是不是?(刷一下5.2下的服务器地毯) – Rudu 2011-02-25 15:28:52

2

最好的办法是删除你想先忽略的领域。

function explode($str, $separator, $ignore_pattern) { 
    $newStr = preg_replace($ignore_pattern, '', $str); 
    return explode($separator, $str); 
} 

用法:

$str = "hello, this is, a test (some, string) thanks"; 
$array = explode($str, ',', '/\(.*?\)/'); 

未经测试,但理论是固体

+0

对于单引号,preg_replace无法正常工作,因为引号内有引号,例如你好,这是一个测试'some,string \'s'谢谢 – fire 2011-02-25 15:38:48

+0

如果你只是想从字符串中删除一个块,你可以使用贪婪的匹配。这将解决报价问题。 – xzyfer 2011-02-25 23:12:17