2013-05-09 103 views
4

我怎麼能由一個分裂的字符串之一,但忽略轉義字符? 這裏我舉的例子,我有字符串: -PHP使preg_split忽略逃脫序列

\ntest\rtest\n 

我希望它是這樣的: -

Array 
(
    [0] => \n 
    [1] => t 
    [2] => e 
    [3] => s 
    [4] => t 
    [5] => \r 
    [6] => t 
    [7] => e 
    [8] => s 
    [9] => t 
    [10] => \n 
) 

有人說使用使preg_split,但我不知道很多關於正則表達式。

+0

爲什麼使用preg_match..use字符串函數'str_split' – diEcho 2013-05-09 06:52:24

+1

對不起,我錯誤,實際上是想寫「preg_split」 – 2013-05-09 06:53:18

+0

char-by-char就足夠了,遇到'\'時會進行一些額外的處理。 – Passerby 2013-05-09 06:56:48

回答

3

反斜槓需要在正則表達式逃逸。
當引用一個實際的反斜槓,你需要一系列的三個\\\

正則表達式匹配

preg_match_all("/\\\?[^\\\]/", $str, $matches); 

現場演示代碼:http://codepad.viper-7.com/FLjH9A

正則表達式分裂 - 只爲教育目的作爲匹配是在這種情況下更合適

$matches=preg_split("/(?<=\\\[^\\\])(?!$)|(?<=[^\\\])(?!$)/", $str); 

現場演示代碼:http://codepad.viper-7.com/yrbtMV

+0

感謝,這是什麼我尋找:) – 2013-05-09 07:32:58

+0

不客氣,棘手的情況 – 2013-05-09 07:33:45

1

如果你只想要得到的數組,你可以通過一個讀取字符一個字符串。無論是關於正則表達式,都可以使用 。

+0

讀取一個字符一個,如果想忽略轉義字符.. – 2013-05-09 06:54:49

0

如果你想給每個單個字符(任選被\之前)匹配,您可以使用:

$str = '\ntest\rtest\n'; 
preg_match_all('/\\\?[a-zA-Z]/', $str, $matches); 

這將返回數組與兩個單和轉義字符序列。

+0

由於沒有工作,但正則表達式看起來像沒「T爲我的例子字符串工作 – 2013-05-09 07:08:28

+0

http://codepad.org/xx9VLHl6 – 2013-05-09 07:18:12

+0

Woops,我的意思是'preg_match_all()','不使preg_split()'。很高興你找到你的答案! – thgaskell 2013-05-09 09:03:30

2

您可以先刪除選擇的轉義字符,然後應用str_split()

$str = "\ntest\rtest\n"; 

print_r(str_split(strtr($str, array(
    '\r' => '', 
    '\n' => '', 
))));