PHP Conference Japan 2024

addcslashes

(PHP 4, PHP 5, PHP 7, PHP 8)

addcslashes以 C 語言風格使用反斜線跳脫字串

說明

addcslashes(字串 $string, 字串 $characters): 字串

傳回一個字串,其中在 `characters` 參數中列出的字元前會加上反斜線。

參數

string (字串)

要跳脫的字串。

characters (字元)

要跳脫的字元列表。如果 `characters` 包含 `\n`、`\r` 等字元,它們會以類似 C 語言的風格轉換,而其他 ASCII 值小於 32 且大於 126 的非英數字元則會轉換為八進位表示法。

當您在 characters 參數中定義字元序列時,請確保您知道在設定為範圍起點和終點的字元之間有哪些字元。

<?php
echo addcslashes('foo[ ]', 'A..z');
// 輸出:\f\o\o\[ \]
// 所有大寫和小寫字母都會被跳脫
// ... 包括 [\]^_`
?>
此外,如果範圍中第一個字元的 ASCII 值高於第二個字元,則不會建構範圍。只有起點、終點和句點字元會被跳脫。使用 ord() 函式可以找到字元的 ASCII 值。
<?php
echo addcslashes("zoo['.']", 'z..A');
// 輸出:\zoo['\.']
?>

如果您選擇跳脫字元 0、a、b、f、n、r、t 和 v,請務必小心。它們將會被轉換為 \0、\a、\b、\f、\n、\r、\t 和 \v,這些都是 C 語言中預先定義的跳脫序列。許多這些序列也在其他 C 語言衍生的語言(包括 PHP)中定義,這表示如果您使用 addcslashes() 的輸出在 characters 中定義了這些字元的語言中產生程式碼,則可能無法獲得預期的結果。

返回值

返回跳脫後的字串。

範例

characters 像是 "\0..\37",它會跳脫 ASCII 碼介於 0 和 31 之間的所有字元。

範例 #1 addcslashes() 範例

<?php
$escaped
= addcslashes($not_escaped, "\0..\37!@\177..\377");
?>

另請參閱

新增筆記

使用者貢獻的筆記 3 則筆記

7
phpcoder at cyberpimp dot pimpdomain dot com
19 年前
如果您使用 addcslashes() 對稍後要解碼回原始格式的文字進行編碼,則您必須在 charlist 中指定反斜線 (\) 字元!

範例

<?php
$originaltext
= '這段文字不包含 \\n 換行字元!';
$encoded = addcslashes($originaltext, '\\');
$decoded = stripcslashes($encoded);
//$decoded 現在包含了 $originaltext 的完整副本
echo $decoded; //顯示字串,保留其字面上的 \n
?>

如果在 addcslashes() 中沒有指定 '\\',那麼 $originaltext 中任何字面上的 \n(或其他 C 風格特殊字元)序列將不會被編碼,但在 stripcslashes() 中會被解碼成控制字元,數據將在編碼-解碼過程中失去其完整性。
3
stein at visibone dot com
17 年前
addcslashes() 將 NUL 視為字串終止符

assert("any" === addcslashes("any\0body", "-"));

除非你指定要將它加上反斜線

assert("any\\000body" === addcslashes("any\0body", "\0"));

(不確定這應該被宣告為錯誤,或者只是 addcslashes() 不是二進制安全的,無論那意味著什麼。)
1
natNOSPAM at noworrie dot NO_SPAM dot com
22 年前
我發現以下程式碼範例更為恰當

<?php
$escaped
= addcslashes($not_escaped, "\0..\37!@\@\177..\377");
?>

這將保護原始、無害的反斜線不被 stripcslashes() 移除。
To Top