• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • addcslashes()

    (PHP 4, PHP 5, PHP 7)

    以 C 语言风格使用反斜线转义字符串中的字符

    说明

    addcslashes(string $str,string $charlist): string

    返回字符串,该字符串在属于参数$charlist列表中的字符前都加上了反斜线。

    参数

    $str

    要转义的字符。

    $charlist

    如果$charlist中包含有\n\r等字符,将以 C 语言风格转换,而其它非字母数字且 ASCII 码低于 32 以及高于 126 的字符均转换成使用八进制表示。

    当定义$charlist参数中的字符序列时,需要确实知道介于自己设置的开始及结束范围之内的都是些什么字符。

    <?php
    echoaddcslashes('foo[ ]','A..z'); 
    //输出:\f\o\o\[ \]
    //所有大小写字母均被转义
    //...但 [\]^(脱字符)、_(下划线)、`(反引号)、\f(分隔符)、\n(换行符)、\r(回车符)等也一并被转义了。
    ?>
    

    另外,如果设置范围中的结束字符 ASCII 码高于开始字符,则不会创建范围,只是将开始字符、结束字符以及其间的字符逐个转义。可使用ord()函数获取字符的 ASCII 码值。

    <?php
    echoaddcslashes("zoo['.']", 'z..A');
    // 输出:\zoo['\.']
    ?>
    

    当选择对字符 0,a,b,f,n,r,t 和 v 进行转义时需要小心,它们将被转换成\0\f\n\r\t \v。在 PHP 中,只有\0(NULL),\r(回车符),\n(换行符)和\t(制表符)是预定义的转义序列,而在 C 语言中,上述的所有转换后的字符都是预定义的转义序列。

    返回值

    返回转义后的字符。

    更新日志

    版本说明
    5.2.5增加了转义序列\vand\f

    范例

    $charlist参数,如“\0..\37”,将转义所有 ASCII 码介于 0 和 31 之间的字符。

    addcslashes()例子

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

    下表包含所有 128 个 ASCII 码对应的十进制(dec)、八进制(oct),十六进制(hex)和字符(ch)的值。

    ASCII 码
    decocthexchdecocthexchdecocthexchdecocthexch
    0000NUL(空)324020(空格)6410040@9614060`
    1101SOH(标题开始)334121!6510141A9714161a
    2202STX(正文开始)344222"6610242B9814262b
    3303ETX(正文结束)354323#6710343C9914363c
    4404EOT(传送结束)364424$6810444D10014464d
    5505ENQ(询问)374525%6910545E10114565e
    6606ACK(确认)384626&7010646F10214666f
    7707BEL(响铃)394727'7110747G10314767g
    81008BS(退格)405028(7211048H10415068h
    91109HT(横向制表)415129)7311149I10515169i
    10120aLF(换行)42522a*741124aJ1061526aj
    11130bVT(纵向制表)43532b+751134bK1071536bk
    12140cFF(换页)44542c,761144cL1081546cl
    13150dCR(回车)45552d-771154dM1091556dm
    14160eSO(移出)46562e.781164eN1101566en
    15170fSI(移入)47572f/791174fO1111576fo
    162010DLE(退出数据链)48603008012050P11216070p
    172111DC1(设备控制1)49613118112151Q11316171q
    182212DC2(设备控制2)50623228212252R11416272r
    192313DC3(设备控制3)51633338312353S11516373s
    202414DC4(设备控制4)52643448412454T11616474t
    212515NAK(反确认)53653558512555U11716575u
    222616SYN(同步空闲)54663668612656V11816676v
    232717ETB(传输块结束)55673778712757W11916777w
    243018CAN(取消)56703888813058X12017078x
    253119EM(媒介结束)57713998913159Y12117179y
    26321aSUB(替换)58723a:901325aZ1221727az
    27331bESC(退出)59733b;911335b[1231737b{
    28341cFS(文件分隔符)60743c<921345c\1241747c|
    29351dGS(组分隔符)61753d=931355d]1251757d}
    30361eRS(记录分隔符)62763e>941365e^1261767e~
    31371fUS(单元分隔符)63773f?951375f_1271777fDEL(删除)

    参见

    • stripcslashes()反引用一个使用 addcslashes 转义的字符串
    • stripslashes()反引用一个引用字符串
    • addslashes()使用反斜线引用字符串
    • htmlspecialchars()将特殊字符转换为 HTML 实体
    • quotemeta()转义元字符集
    If you are using addcslashes() to encode text which is to later be decoded back to it's original form, you MUST specify the backslash (\) character in charlist!
    <?php
      $originaltext = 'This text does NOT contain \\n a new-line!';
      $encoded =addcslashes($originaltext, '\\');
      $decoded =stripcslashes($encoded);
      //$decoded now contains a copy of $originaltext with perfect integrityecho$decoded; 
      //Display the sentence with it's literal \n intact
    ?>
    If the '\\' was not specified in addcslashes(), any literal\n (or other C-style special character) sequences in $originaltext would pass through un-encoded, but then be decoded into control characters by stripcslashes() and the data would lose it's integrity through the encode-decode transaction.
    
    addcslashes() treats NUL as a string terminator:
       assert("any" ===addcslashes("any\0body", "-"));
    unless you order it backslashified:
       assert("any\\000body" ===addcslashes("any\0body", "\0"));
    (Uncertain whether this should be declared a bug or simply that addcslashes() is not binary-safe, whatever that means.)
    
    I have found the following to be much more appropriate code example:
    <?php
    $escaped =addcslashes($not_escaped, "\0..\37!@\@\177..\377");
    ?>
    This will protect original, innocent backslashes from stripcslashes.
    

    If you need JS escaping function, usejson_encode()instead.

    Be carefull with adding the \ to the list of encoded characters. When you add it at the last position it encodes all encoding slashes. I got a lot of \\\ by this mistake.
    So always encode \ at first.

    echoaddcslashes("zoo['.']", 'z..A');
    Above code will create an error as per below
    Invalid '..'-range, '..'-range needs to be incrementing -
    
    jsAddSlashes for XHTML documents:
    <?php
    header("Content-type: text/xml");print <<<EOF<?xml version="1.0"?>
    <html>
    <head>
    <script type="text/javascript">EOF;function jsAddSlashes($str)
    {
        $pattern = array(
            "/\\\\/"  , "/\n/"    , "/\r/"    , "/\"/"    ,
            "/\'/"    , "/&/"     , "/</"     , "/>/"
        );
        $replace = array(
            "\\\\\\\\", "\\n"     , "\\r"     , "\\\""    ,
            "\\'"     , "\\x26"   , "\\x3C"   , "\\x3E"
        );
        return preg_replace($pattern, $replace, $str);
    }$message= jsAddSlashes("\"<Hello>\",\r\n'&World'\\!");print <<<EOFalert("$message");
    </script>
    </head>
    <body>
    	<h1>Hello, World!</h1>
    </body>
    </html>
    EOF;
    ?>
    
    <?php
    function jsaddslashes($s)
    {
    	$o="";
    	$l=strlen($s);
    	for($i=0;$i<$l;$i++) { $c=$s[$i]; switch($c) { case '<': $o.='\\x3C'; break;
    	   case '>': $o.='\\x3E'; break;
    	   case '\'': $o.='\\\''; break;
    	   case '\\': $o.='\\\\'; break;
    	   case '"':  $o.='\\"'; break;
    	   case "\n": $o.='\\n'; break;
    	   case "\r": $o.='\\r'; break;
    	   default:
    	   $o.=$c;
    	  }
    	}
    	return $o;
    }
    ?>
    <script language="javascript">document.write("<? echo jsaddslashes('<h1 style="color:red">hello</h1>');?>");
    </script>
    output :
    <script language="javascript">document.write("\x3Ch1 style=\"color:red\"\x3Ehello\x3C/h1\x3E");
    </script>
    

    下篇:addslashes()