如果你在編寫 PHP 腳本的過程中需要將某些字符串轉義成像 \0、\b、\r、\n、\t 等字符以及特定的 ASCII 字符(0x00 ~ 0x1F、0x7F)的轉義序列,那么你可以使用 PHP 內置函數 addcslashes。
$string = 'hello world' . "\0"; echo addcslashes($string, "\0..\31\177"); // 輸出 hello world\0
如上例所示,我們將字符串 $string 轉義為一個以 \0 結尾的字符串。其中,使用了 addcslashes 函數,函數的參數 $string 是要轉義的字符串,參數 $charlist 是被轉義的字符列表。
字符列表 \0..\31\177 表示需要被轉義的 ASCII 碼范圍,本例中即為 0x00 至 0x1F 和 0x7F,而在轉義序列中,\0 表示 ASCII 碼值為 0 的 NUL 字符。
當然,你也可以將 $charlist 參數指定為需要轉義的具體字符,如下例所示:
$string = "Hello world! \r\n"; echo addcslashes($string, "\r\n\t "); // 輸出 Hello\ world\!\ \r\ \n
在此例子中,我們將字符串 $string 轉義成以換行、回車、水平制表符和空格為間隔的字符串。需要注意的是,在 $charlist 中,每個字符用一個反斜杠轉義,因為 $charlist 參數是可以使用反斜杠自轉義的。
另外,如果你需要將一個長字符串轉義生成一個 C 語言的字符串常量,那么也可以使用 addcslashes 函數。
$string = "I'm a PHP developer.\"Welcome to \0 PHP world!\n\""; echo addcslashes($string, "\0..\37\42\134"); // 輸出 I\'m\ a\ PHP\ developer\.\"Welcome\ to\ \\0\ PHP\ world!\\n\"
上述例子中,我們將一個長字符串轉義生成一個 C 語言的字符串常量。在 $charlist 參數中,\0..\37\42\134 表示需要被轉義的字符除了字母和數字外,剩下的特殊字符,/\ 符號是需要轉義的,因為它是 C 語言字符串中的轉義符。
在最后,我們需要注意雖然 addcslashes 可以將字符列表轉義成對應的轉義序列,但是這并不代表這個字符串就可以安全的輸出到網絡或文件中。在實際操作中,必須謹慎對待特殊字符以避免某些攻擊。