PHP 字符串String

      一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode 。


一个字符串可以用 4 种方式表达: 
◦ 单引号  
◦ 双引号  
◦ heredoc 语法结构  
◦ nowdoc 语法结构(自 PHP 5.3.0 起) 


单引号
      定义一个字符串的最简单的方法是用单引号把它包围起来(字符 ')。 要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。要表达一个反斜线自身,则用两个反斜线(\\)。其它任何方式的反斜线都会被当成反斜线本身,也就是说如果想使用其它转义序列例如 \r 或者 \n,并不代表任何特殊含义,就单纯是这两个字符本身。


双引号
      如果字符串是包围在双引号(")中, PHP 将对一些特殊的字符进行解析: 

序列含义
\n换行(ASCII 字符集中的 LF 或 0x0A (10))
\r回车(ASCII 字符集中的 CR 或 0x0D (13))
\t水平制表符(ASCII 字符集中的 HT 或 0x09 (9))
\v垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)
\eEscape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)
\f换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)
\\反斜线
\$美元标记
\"双引号
\[0-7]{1,3}符合该正则表达式序列的是一个以八进制方式来表达的字符
\x[0-9A-Fa-f]{1,2}符合该正则表达式序列的是一个以十六进制方式来表达的字符 

Heredoc 结构
      第三种表达字符串的方法是用 heredoc 句法结构:<<<。在该运算符之后要提供一个标识符,然后换行。接下来是字符串 string 本身,最后要用前面定义的标识符作为结束标志。 结束时所引用的标识符必须在该行的第一列,而且,标识符的命名也要像其它标签一样遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。 

      要注意的是结束标识符这行除了可能有一个分号(;)外,绝对不能包含其它字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或制表符。更重要的是结束标识符的前面必须是个被本地操作系统认可的换行,比如在 UNIX 和 Mac OS X 系统中是 \n,而结束定界符(可能其后有个分号)之后也必须紧跟一个换行。 


Nowdoc 结构
      就象 heredoc 结构类似于双引号字符串,Nowdoc 结构是类似于单引号字符串的。Nowdoc 结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作。这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。一个 nowdoc 结构也用和 heredocs 结构一样的标记 <<<, 但是跟在后面的标识符要用单引号括起来,即 <<<'EOT'。Heredoc 结构的所有规则也同样适用于 nowdoc 结构,尤其是结束标识符的规则。 


变量解析
      当字符串用双引号或 heredoc 结构定义时,其中的变量将会被解析。这里共有两种语法规则:一种简单规则,一种复杂规则。简单的语法规则是最常用和最方便的,它可以用最少的代码在一个 string 中嵌入一个变量,一个 array 的值,或一个 object 的属性。 复杂规则语法的显著标记是用花括号包围的表达式。任何具有 string 表达的标量变量,数组单元或对象属性都可使用此语法。只需简单地用花括号 { 和 } 把它括起来即可。由于 { 无法被转义,只有 $ 紧挨着 { 时才会被识别。可以用 {\$ 来表达 {$。函数、方法、静态类变量和类常量只有在 PHP 5 以后才可在 {$} 中使用。然而,只有在该字符串被定义的命名空间中才可以将其值作为变量名来访问。只单一使用花括号 ({}) 无法处理从函数或方法的返回值或者类常量以及类静态变量的值。 


存取和修改字符串中的字符

      string 中的字符可以通过一个从 0 开始的下标,用类似 array 结构中的方括号包含对应的数字来访问和修改,比如 $str[42]。可以把 string 当成字符组成的 array。函数 substr() 和 substr_replace() 可用于操作多于一个字符的情况。 用超出字符串长度的下标写入将会拉长该字符串并以空格填充。非整数类型下标会被转换成整数。非法下标类型会产生一个 E_NOTICE 级别错误。

<?php
    // 单引号
    echo 'I\'ll be back!'."<br>";
    echo 'C:\\*.* \n $expand'."<br>";
    
    // Heredoc - 类似双引号
    echo <<< EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

    // Nowdoc - 类似单引号
echo <<< 'EOD'
Example of string \n
spanning multiple lines
using heredoc syntax.
EOD;
echo "<br>";

    // 变量解析 - 简单规则
    $juice = 'apple';
    echo "he drank some $juice"."<br>";
    
    $juices = array("apple", "orange", "koolaid1" => "purple");
    echo "He drank some $juices[0] juice."."<br>";
    
    // 变量解析 - 复杂规则
    class Foo {
        var $bar = 'I am bar.';
    }
    $Foo = new Foo();
    $bar = 'bar';
    $baz = array('foo', 'bar', 'baz', 'quux');
    echo "{$Foo->$bar}"."<br>";
    echo "{$Foo->$baz[1]}"."<br>";

    class Beers {
        const softdrink = 'rootbeer';
        public static $ale = 'ipa';
    }
    $rootbeer = 'A & W';
    $ipa = 'Alexander Keith\'s';

    // 有效,输出: I'd like an A & W
    echo "I'd like an {${Beers::softdrink}}"."<br>";

    // 也有效,输出: I'd like an Alexander Keith's
    echo "I'd like an {${Beers::$ale}}"."<br>";
    
    // 存储字符
    $str = 'This is a test';
    echo "{$str[strlen($str)-1]}"."<br>";
    
    // array <=> string
    $arr1 = explode('@', 'I@Love@You');
    print_r($arr1); echo "<br>";
    
    echo implode('@', array('I', 'Love', 'You'))."<br>";
    
    // 字符串比较 
    if(strcasecmp('ABC', 'abc') == 0)
    {
        echo "equals"."<br>";
    }
    if(strcmp('ABC', 'abc') != 0)
    {
        echo "not equals"."<br>";
    }
    
    // numer 格式化
    echo number_format(1234.56, 2, '.', ',')."<br>";
    
    // 自动添加转义符与恢复
    $str2 = addslashes("I'll studying hard!");
    print $str2."<br>"; 
    print stripslashes($str2);       
?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郎涯技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值