2012-04-23 72 views
1

這個問題與use preg_split instead of split非常相似,但我對我正在清除的正則表達式有一些疑惑。分裂爲preg_split

試圖更新一些現有的split()函數來使用preg_split()來代替,並且我得到一些不清楚的結果。運行下面的代碼會給我不同長度的數組,我不知道爲什麼。

從我可以看到split \ n匹配\ n與可能\ r事先。 我認爲preg_split也是這樣做的,但爲什麼它會創建2個分割?這是否與懶惰/貪婪匹配?

演示代碼:

$test = "\r\n"; 

$val = split('\r?\n', $test); //literal interpretation of string 
$val_new = split("\r?\n", $test); //php understanding that these are EOL chars 
$val2 = preg_split('/\r?\n/', $test); 

var_dump($val); // returns array(1) { [0]=> string(2) " " } 
var_dump($val2); // returns array(2) { [0]=> string(0) "" [1]=> string(0) "" } 

編輯:增加了基於Kolinks評論$ val_new因爲他們幫助清理我對問題的理解,可能是使用的另一個太

回答

1

split不理解\r\n作爲特殊字符,並且因爲您使用了單引號,所以PHP不會將它們視爲特殊字符。所以split正在尋找文字\\n\r\n

preg_split,而另一方面,也明白\r\n特殊字符,所以儘管這樣做PCRE,因此字符串正確分割PHP不善待他們。

這與惰性/貪婪匹配沒有任何關係,這都是因爲單引號沒有將\r\n解析爲它們的換行符意義。

+0

啊哈,這是現在完美的意義,並幫助我解決了我的問題。非常感謝您的明確解釋 - 只要我允許,將其標記爲答案 – 2012-04-23 16:29:05

2

你應該PREG_SPLIT_NO_EMPTY標誌作爲preg_split的第三個參數來忽略拆分數組中的空標記。所以,如果你使用

preg_split('/\r?\n/', $test, PREG_SPLIT_NO_EMPTY); 

那麼它將表現與分裂功能相同。

,並由您在分割功能使用\r?\n沒有做任何分裂(因爲拆分不理解在單引號\r\n)並返回你的原始字符串回來的路上。

編輯:或者您可以使用分體式雙引號的正則表達式:

split("\r?\n", $test); 

你的字符串分割成2個元素的數組。

+0

不是什麼被問到... – 2012-04-23 16:21:39

+0

這是在一些編輯中,請檢查它現在更好的解釋。 – anubhava 2012-04-23 16:22:27

+0

仍然錯誤,特別是因爲['split()'](http://php.net/split)被明確定義爲「通過正則表達式將字符串拆分成***」 – 2012-04-23 16:23:13