2011-08-17 84 views
2

我有一個文本文件,其中的文字字符串\r\n。我想用實際換行符(\ n)替換它。問題替換字符串 r n在PHP中換行

我知道正則表達式/\\r\\n/應該匹配它(我已經在Reggy中測試過它),但我無法讓它在PHP中工作。

我曾嘗試以下變化:

preg_replace("/\\\\r\\\\n/", "\n", $line);

preg_replace("/\\\\[r]\\\\[n]/", "\n", $line);

preg_replace("/[\\\\][r][\\\\][n]/", "\n", $line);

preg_replace("/[\\\\]r[\\\\]n/", "\n", $line);

如果我只是嘗試更換反斜槓,它工作正常。只要我添加一個r,它就會發現沒有匹配。

我正在閱讀的文件被編碼爲UTF-16。

編輯:

我也已經在使用str_replace()嘗試。

我現在認爲這裏的問題是文件的字符編碼。我試了下面,它確實工作:

$testString = "\\r\\n"; 
echo preg_replace("/\\\\r\\\\n/", "\n", $testString); 

但它不工作我從我的文件中讀取的行。

回答

2

UTF-16是問題所在。如果你只是用生工作的字節數,那麼你可以使用完整的序列替代:

$out = str_replace("\x00\x5c\x00\x72\x00\x5c\x00\x6e", "\x00\x0a", $in); 

這是假設大端UTF-16,其他交換零個字節來非零點後:

$out = str_replace("\x5c\x00\x72\x00\x5c\x00\x6e\x00", "\x0a\x00", $in); 

如果這不起作用,請發佈輸入文件的字節轉儲,以便我們可以看到它實際包含的內容。

+0

完美運作。謝謝!另外,你能告訴我你在哪裏得到了UTF-16的字節值嗎?我之前搜索時找不到它。 – Katfish

+1

如果忽略代理對,UTF-16只需要'U + abcd'並將其編碼爲2個字節'\ xab \ xcd'。這些代碼就是反斜槓(x5c),'r'(x72)和'n'(x6e)的ASCII字節。 0x0a是你想替換它們的換行符 – Cal

5

保存自己搞清楚的正則表達式,並嘗試str_replace(),而不是努力:

str_replace('\r\n', "\n", $string); 
+0

我應該在我原來的問題中提到那也行不通。我現在補充一下。 – Katfish

+1

+1不使用正則表達式。 –

+3

@Katfish使用單引號而不是雙引號。 'str_replace('\ r \ n',「\ n」,$ string)' – Wiseguy

3

保存自己搞清楚正則表達式的努力和雙引號內的轉義:

$fixed = str_replace('\r\n', "\n", $line); 

爲了什麼這是值得的,preg_replace("/\\\\r\\\\n/", "\n", $line);應該沒問題。作爲示範:

var_dump(preg_replace("/\\\\r\\\\n/", "NL", 'Cake is yummy\r\n\r\n')); 

給出:string(17) "Cake is yummyNLNL"

而且罰款是:'/\\\r\\\n/''/\\\\r\\\\n/'

重要 - 如果上述不工作,你甚至不確定字面\r\n就是你'試圖匹配?..

+1

lol:D完全相同的開始:D + +1 – NikiC

+0

這絕對是我想要匹配的,但我現在懷疑r和n可能與PHP使用的r和n不同。我的文件使用UTF-16。 – Katfish

1
$result = preg_replace('/\\\\r\\\\n/i', '\n', $subject);