2010-08-05 66 views
14

我認爲這可能是一個愚蠢的問題,但我很困惑我是否需要在PHP中轉義反斜槓。在PHP中我需要逃避反斜槓?

echo 'Application\Models\User'; prints Application\Models\User 
echo 'Application\\Models\\User'; same output 
echo 'Application\Model\'User'; gives Application\Model'User 

所以這是一個轉義字符,我不應該需要逃避它(\)如果我想指的Application\Models\User

回答

25

single quoted strings只有轉義序列\\\'被認可;任何其他出現的\被解釋爲普通字符。

如此以來\M\U沒有有效的轉義序列,它們被解釋爲它們。

+0

但逃避反斜槓本身似乎是可選的,對不對?所以我可以寫'Hello \ world''和'Hello \\ world''。當然,您的答案意味着'\ w'不是有效的轉義序列,因此輸出爲書寫。 – caw 2016-12-03 03:54:39

+0

@caw:不,它不會在這裏工作,但是這是因爲_不_逃避反斜槓是「可選」,而是因爲在'\ w'組合無法匹配任何東西,而返回到它的字面形式。但是,嘗試打印一個'\\',例如,不要逃避。或者任何以單個反斜槓結尾的內容。你會得到一個解析錯誤。 – 2018-01-24 19:24:29

+0

@Sz這只是因爲單個反斜槓將被解釋爲以下單引號的轉義字符。當然你是對的。出於您陳述的原因,反斜槓的轉義通常是可選的,即在大多數其他情況下它將是無效的轉義序列,因此將其打印爲文字反斜槓。 – caw 2018-01-24 21:25:28

0

由於您的最後一個例子包含引號('),你需要逃脫這樣的字符串與addslashes功能還是簡單地增加前一個斜線自己是這樣的:

'Application\Model\\'User' 
1

在單引號中的字符串,它是可選的轉義反斜線,唯一的例外是當一個單引號或反斜槓之前的(因爲\'\\是逃生序列)。

這編寫正則表達式的時候,因爲他們往往包含反斜槓是常見的。閱讀preg_replace('/\w\b/', ' ', $str)/\\w\\b/更容易閱讀。

manual

+2

正如手冊和接受的答案中所述,反斜槓必須避免。 – 2013-06-22 00:22:27

+0

@GrasDouble不,他們不。這個答案是正確的。 – caw 2016-12-03 03:56:07

+2

實際上,除了一種情況外,它們不必轉義:如果反斜槓是最後一個字符。 ''foo \\''起作用,但'foo \'不起作用。我認爲非逃避的反斜槓應該被認爲是一個句法糖。爲了保持一致性,你可能總想逃避它們,但這取決於你。 – 2016-12-03 05:14:52

0

我認爲這取決於上下文,但如果文件路徑中使用它來逃避反斜槓一個好主意。

另一個好主意是目錄分隔分配給一個恆定的,這是我見過之前在各種應用中進行,並且因此使用它:如果你想節省空間和打字

<?php 
define('DIRECTORY_SEPARATOR', '\\'); 

echo 'Application'.DIRECTORY_SEPARATOR . 'Models' . DIRECTORY_SEPARATOR . 'User'; 
?> 

,其他人使用DS作爲常數名稱。

<?php 
define('DS', '\\'); 

echo 'Application'.DS.'Models'.DS.'User'; 
?> 

這樣可以使你的應用程序移植,如果你在Windows環境移動到* nix的環境,因爲你可以簡單的改變目錄分隔恆正斜槓。

+4

'DIRECTORY_SEPARATOR'是一個預定義的PHP常量,所以你不能(也不想)重新定義它。 – 2013-06-22 00:17:54