2011-02-25 51 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