PHP中的字符串 — 表示方法
Strings
一个string是一连串的字符,其中的字符与一个byte相同。也就是说PHP只支持一个256的字符集,因此本质上不支持Unicode编码,关于Unicode阅读utf8_encode()和utf8_decode()。
注意: 一个字符串的大小决定与计算机内存的大小,理想情况下,字符串可以无限大。
语法
一个 string 可以使用下面四种方法表示:
- single quoted
- double quoted
- heredoc syntax
- nowdoc syntax (从 PHP 5.3.0开始使用)
Single quoted (单引号表示法)
定义一个string最简单的方法是将字符串放到一对单引号当中(字符‘)。
字符串本身当中的单引号可以使用反斜线(\)转义, 单个反斜线可以使用两个反斜线输出(\\)。除此之外,其它左右的反斜线将会被当作正常字符处理:也就是说,以前经常用的转义字符会原样输出。如\r\n等,不会再有特殊意义。
注意: 与double-quoted 和 heredoc 不同,特殊的变量和转义序列在单引号表示法中 不会 有特殊的意义。
<?php
echo 'this is a simple string';echo 'You can also have embedded newlines in
strings this way as it is
okay to do';// Outputs: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';// Outputs: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';// Outputs: You deleted C:\*.*?
echo 'You deleted C:\*.*?';// Outputs: This will not expand: \n a newline
echo 'This will not expand: \n a newline';// Outputs: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
如果字符串使用双引号表示,PHP则会将特殊转义序列按照他们对应的意义进行翻译:
序列 | 意义 |
---|---|
\n | linefeed (LF or 0x0A (10) in ASCII) |
\r | carriage return (CR or 0x0D (13) in ASCII) |
\t | horizontal tab (HT or 0x09 (9) in ASCII) |
\v | vertical tab (VT or 0x0B (11) in ASCII) (since PHP 5.2.5) |
\f | form feed (FF or 0x0C (12) in ASCII) (since PHP 5.2.5) |
\\ | backslash |
\$ | dollar sign |
\" | double-quote |
\[0-7]{1,3} | the sequence of characters matching the regular expression is a character in octal notation |
\x[0-9A-Fa-f]{1,2} | the sequence of characters matching the regular expression is a character in hexadecimal notation |
除了上面这些,转义其它任何字符将会像单引号表示法一样——反斜线也会被打印。PHP 5.1.1之前, t\{$var}当中的反斜线不会被打印。
双引号最重要的功能是,双引号当中的变量名字会被相应的值替换。详细介绍阅读string parsing。
Heredoc
第三种界定字符串的技术是使用heredoc:在<<<操作符之后,添写一个标识符,然后新起一行 是字符串本身的内容,字符串本身结束后再新起一行以相同的标识符结束。
必须 顶格写()。同样,标识符的命名必须符合PHP当中其它标识符命名的规则。必须只包含字母、数字和下划线,而且不能以数字开头。
结束标识符必须顶格写(从行的第一列开始)。同样,标识符的命名必须符合PHP当中其它标识符命名规则。必须只包含字母、数字和下划线,而且不能以数字开头。
警告
一定要注意,除了 可能 包含一个分号外,结束标识符前不能还有其它字符。也就是说此标识符不能被缩进,而且分号前不含有空格或tab格。在结束标识符前面第一个字符应该是系统定义的换行符,在Unix和Mac OS X 中是\n。结束标识符后必须也是换行符。
如果不符合此规则,结束标识符不会被识别为字符串结束的标志,PHP会继续向下搜寻,如果一直到文件的结束还没有找到一个合适的结束标识符,那么PHP便会在最后一行产生一个语法错误。
Heredocs 不能初始化类的属性。但是从PHP 5.3 开始,只有当heredocs中含有变量的时候这种初始化方法是不正确的。
Example #1 错误的例子
public$bar= <<<EOTbar
EOT;
}
?>
Heredoc 对字符串的处理与双引号表示法类似,但是对双引号的处理是一个例外。也就是说,双引号在heredoc当中不需要被转义,但是在上述转义字符表中的其它转义字符可以使用。变量会被展开,但在heredoc中表示一个复杂的变量的时候需要小心。
Example #2 Heredoc string quoting example
$str= <<<EODExample of string
spanning multiple lines
using heredoc syntax.EOD;/* More complex example, with variables. */classfoo{
var$foo;
var$bar;
function
foo(){$this->foo='Foo';$this->bar= array('Bar1','Bar2','Bar3');
}
}$foo= newfoo();$name='MyName';
echo <<<EOT
My name is "$name". I am printing some$foo->foo.Now, I am printing some{$foo->bar[1]}.
This should print a capital 'A': \x41EOT;?>
上边例子的输出:
也可以使用Heredoc给函数传递参数:
Example #3 Heredoc in arguments example
var_dump(array(<<<EODfoobar!EOD
));?>
#As of PHP 5.3.0, it's possible to initialize static variables and class properties/constants using the Heredoc syntax:#
自PHP 5.3.0开始,可以使用Heredoc初始化静态变量和类的属性/常量。
Example #4 Using Heredoc to initialize static values
{
static$bar= <<<LABELNothing in here...LABEL;
}// Class properties/constantsclassfoo{
constBAR= <<<FOOBARConstant exampleFOOBAR;
public
$baz= <<<FOOBARProperty exampleFOOBAR;}?>
#Starting with PHP 5.3.0, the opening Heredoc identifier may optionally be enclosed in double quotes:#
从PHP 5.3.0 开始,起始标识符可以包含在双引号当中:
Example #5 Using double quotes in Heredoc
注意:
Heredoc 从 PHP 4 开始被支持。
像heredoc与双引号的对应相似,nowdoc与单引号对应。nowdoc的定义与heredoc相似,但是在nowdoc中 没有解析操作 。 这种结构对于嵌入PHP代码或者其它不需要被转义的代码来说是理想的。它与SGML的<![CDATA[]>同样,具有声明一个不需要被解析的代码块的功能。
nowdoc也以<<<作为标识,但是其后声明的标识符需要使用单引号。例如:<<<'EOT"。对heredoc的所有规则对nowdoc来说都有效,特别是那些对结束标识符的规则。
Example #6 Nowdoc string quoting example
$str= <<<'EOD'Example of string
spanning multiple lines
using nowdoc syntax.EOD;/* More complex example, with variables. */classfoo{
public$foo;
public$bar;
function
foo(){$this->foo='Foo';$this->bar= array('Bar1','Bar2','Bar3');
}
}$foo= newfoo();$name='MyName';
echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41EOT;?>
上边列子的输出:
注意:
与heredocs不同的是,nowdocs可以在任何静态数据环境中使用。一个经典的例子就是初始化类的属性和常量:
Example #7 Static data example
<?phpclassfoo{
public$bar= <<<'EOT'barEOT;
}?>
注意:
从 PHP 5.3.0 开始添加对nowdoc的支持。
当一个字符串被指定在双引号或者heredoc当中的时候,变量将会被解析。
有两种语法类型:一个是简单的和一个是复杂的。简单的语法是最平常的,并且特别方便。它提供的方式可以毫不费力的在字符串当中嵌入一个变量、数组的值,或者一个类的属性。
PHP 4当中介绍了复杂语法类型,可以通过表达式周围的花括号辨认出这种方法。
如果遇到了一个dollar 符号 ($) ,解析器会尽量最大长度的识别出一个正确变量名字。闭合的花括号可以明确的指定变量名字的边界。
$juice="apple";
echo
"He drank some$juicejuice.".PHP_EOL;echo"He drank some juice made of$juices.";//错误,juices是一个正确的变量名所以juices不会被识别?>
上述程序输出:
同样地,数组的下标和对象的属性也会被解析。数组的下标以方括号为标识(]),对象属性的解析规则与普通变量类似。
Example #8 Simple syntax example
$juices= array("apple","orange","koolaid1"=>"purple");
echo
"He drank some$juices[0]juice.".PHP_EOL;echo"He drank some$juices[1]juice.".PHP_EOL;
echo"He drank some juice made of$juice[0]s.".PHP_EOL;// 不工作echo"He drank some$juices[koolaid1]juice.".PHP_EOL;
class
people{public$john="John Smith";
public$jane="Jane Smith";
public$robert="Robert Paulsen";
public$smith="Smith";
}$people= newpeople();
echo
"$people->johndrank some$juices[0]juice.".PHP_EOL;echo"$people->johnthen said hello to$people->jane.".PHP_EOL;
echo"$people->john's wife greeted$people->robert.".PHP_EOL;
echo"$people->robertgreeted the two$people->smiths.";// 不工作?>
上述程序的输出:
对于任何复杂的变量,应该使用复杂句法规则。
不是因为句法复杂而叫做复杂,而是因为这种方法可以表示复杂的表达式。
字符串当中的任何标量变量、数组元素或者对象属性都可以使用这种方法表示。这种方法要求把字符串中的变量使用花括号括起来。只有当{和$紧挨着的时候才是有效的表达。可以使用"{\$"表示字符串{$。通过例子加以说明:
echo"This is${great}";// 有效echo"This square is{$square->width}00 centimeters broad.";// 有效, quoted keys only work using the curly brace syntaxecho"This works:{$arr['key']}";// Worksecho"This works:{$arr[4][3]}";// 错误,PHP会寻找一个名字为foo的常量,但是foo没定义echo"This is wrong:{$arr[foo][3]}";// 有效echo"This works:{$arr['foo'][3]}";// Works.echo"This works: ".$arr['foo'][3];
echo
"This works too:{$obj->values[3]->name}";echo
"This is the value of the var named$name:{${$name}}";echo
"This is the value of the var named by the return value of getName():{${getName()}}";echo
"This is the value of the var named by the return value of \$object->getName():{${$object->getName()}}";// 无效,输出: This is the return value of getName(): {getName()}echo"This is the return value of getName(): {getName()}";?>也可以使用这种方法访问一个类的属性。
var$bar='I am bar.';
}$foo= newfoo();$bar='bar';$baz= array('foo','bar','baz','quux');
echo"{$foo->$bar}\n";
echo"{$foo->$baz[1]}\n";?>
The above example will output:
I am bar.
I am bar.
注意:
在{$}中的函数、方法调用、静态类变量和常量从PHP 5开始支持。然而,只有当在变量的名字已经被定义的时候这种方式才有效。
class
beers{constsoftdrink='rootbeer';
public static$ale='ipa';
}$rootbeer='A & W';$ipa='Alexander Keith\'s';// This works; outputs: I'd like an A & Wecho"I'd like an{${beers::softdrink}}\n";// This works too; outputs: I'd like an Alexander Keith'secho"I'd like an{${beers::$ale}}\n";?>
字符串中的字符可以通过数组的形式进行存取和修改,下标0代表第一个字符。此时,可以把字符串想象成包含若干字符的数组。函数substr()和substr_replace()可以一次修改多个字符。
注意:: Strings大括号也适用与这种方法,如字符串中,$str{42}和$str[42]代表的同一个字符。
越界访问会使字符串使用空格填充。Non-integer types are converted to integer.非法的下标引起 E_NOTICE. 写入时,负数下标引起 E_NOTICE 错误,但读取的时候读到的是空字符。 Only the first character of an assigned string is used. Assigning empty string assigns NULL byte.(这句翻译的真是乱七八糟)
Example #9 Some string examples
注意:
使用[]和{}访问其他类型的变量(不包括数组或者对象)返回 NULL。
多个字符串可以使用 '.' (dot) 操作符连接在一起。注意 '+' (addition) 不能 用于实现这种功能。 更多内容阅读 String operators 。
有大量的函数可以操作和控制字符串。
阅读 string functions section 学习基本功能函数, 阅读 regular expression functions 或者 Perl-compatible regular expression functions 学习高级应用。
也有许多函数用来处理URL字符串,相关详细介绍情阅读 functions for URL strings, 还有许多函数是用来加密解密的如mcrypt 和 mhash。
最后, 不要忘了阅读 character type functions 。
使用强制类型转换或者 strval() 函数可以把某个值转换为字符串。在需要字符串的时候字符串的转换会自动完成。使用 echo() 或者 print() 或者与字符串进行比较的变量都会发生这种转换,, 在 Types 和 Type Juggling 章节中对此做了具体介绍。还有 settype() 函数。
布尔类型的 TRUE 会转成字符串 "1"。布尔类型的 FALSE 被转换成字符串 "" (空字符串)。 这种转换是可逆的。
一个整数或者是浮点数会按照原样转成字符串(包括浮点数的阶部分)。
# 测试了一下,(4.1E+6)被转换成了4100000
# 还是不太明白浮点数是怎么转的
注意:
The decimal point character is defined in the script's locale (category LC_NUMERIC). See the setlocale() function.
数组类型的变量会被转换成字符串 "Array";因此,echo() 和print() 不能直接输出如组的内容。查看单个元素可以使用这种结构: echo $arr['foo']。
对象 在 PHP 4 中被转换成字符串 "Object". 阅读下面章节可以学习如何在调试程序时打印合适的值。可以使用 get_class() 函数获取一个类的名字。自 PHP 5 开始, 适当的时候可以使用__toString 方法。
Resources 会转化成 "Resource id #1"这种结构的字符串,1 表示的是PHP运行的时候指派的唯一的数字。Do not rely upon this structure; it is subject to change. To get a resource's type, use the get_resource_type() function.
NULL 总是转换成空字符串。
如上所述,直接转换 array, object, 或者 resource 到 string 不会生成对变量值任何有用的信息。学习函数 print_r() 和 var_dump() 可以获取关于变量内容的知识。
PHP中大多数的数值可以转换成字符串永久存储。这种技术叫做串行化, 可以通过 serialize() 函数实现。If the PHP engine was built with WDDX support, PHP values can also be serialized as well-formed XML text.
如果字符串当中不包括 '.', 'e', 或者 'E' 字符,并且数字值符合整数类型限制(PHP_INT_MAX中定义),字符串将会被转换成一个整形数,其它情况,字符串会被转换成浮点数。
数字的值是字符串前面部分确定的,如果一个字符串以一个正确格式的数字形式的字符开头,那么在转换的时候,这个数字就是变量的值,否则,字符串将会被转换成0。数字形的字符串:
符号(可选)+数字+阶符(可选)+数字(可选)
$foo=1+"10.5";// $foo is float (11.5)$foo=1+"-1.3e3";// $foo is float (-1299)$foo=1+"bob-1.3e3";// $foo is integer (1)$foo=1+"bob3";// $foo is integer (1)$foo=1+"10 Small Pigs";// $foo is integer (11)$foo=4+"10.2 Little Piggies";// $foo is float (14.2)$foo="10.0 pigs "+1;// $foo is float (11)$foo="10.0 pigs "+1.0;// $foo is float (11)?>
更多内容可以在Unix中查阅 strtod(3) 手册。
可以使用下面的语句测试该例子:
PHP不会像C那样将字符按照ASCII码转换成数字。可以使用 ord() 和 chr() 函数在 ASCII 码和字符之间进行转换。
转载于:https://www.cnblogs.com/tham/p/6827481.html
PHP中的字符串 — 表示方法相关推荐
- linux shell脚本字符串连接符,学习Linux shell脚本中连接字符串的方法
这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...
- dedecms arclist中截取字符串的方法
小编给大家分享一下dedecms arclist中截取字符串的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! dede ...
- Go语言中的字符串拼接方法介绍
本文介绍Go语言中的string类型.strings包和bytes.Buffer类型,介绍几种字符串拼接方法. 目录 string类型 strings包 strings.Builder类型 strin ...
- 在Excel中连接字符串的方法
在Excel中连接字符串的方法 此段文字节选自<Excel 2007技巧大全>一书 有时在使用Excel过 ...
- java和js中替换字符串的方法
//java中字符串的替换方法: String a = "吴林飞-1a_,唐姐-2,周帅-3"; String f = a.replaceFirst("-", ...
- go语言字符串换行_Go语言中的字符串处理方法示例详解
1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号(" ...
- php如何获取炸开一个数,php中打散字符串的方法
php中打散字符串的方法 发布时间:2020-06-26 15:25:11 来源:亿速云 阅读:132 作者:Leah 本篇文章为大家展示了php中打散字符串的方法,代码简明扼要并且容易理解,绝对能使 ...
- 在JS中反转字符串的方法
在JS中反转字符串的方法 方法一: 字符串也是按照索引排列的 字符串也可以使用索引获取某一位字符 使用for 循环遍历,遍历字符串中的每一位数 倒着拼接到新的字符串上面 <script>f ...
- c语言中去掉全角空格,c#中去掉字符串空格方法
(1)Trim方法 string tt=" aaa "; tt=tt.Trim() 去字符串首尾空格的函数 tt=tt.TrimEnd() 去掉字符串尾空格 tt= ...
最新文章
- 图像的矩,以及利用矩求图像的重心,方向
- Luogu P1087 FBI树
- MongoDB中mapReduce的使用
- 折半查找python实现
- ELK(ElasticSearch+Logstash+ Kibana)搭建实时日志分析平台
- TextBox控件怎样赋值化学符号
- JavaOne 2012:非阻塞数据结构如何工作?
- JAVA知识基础(七):封装
- 为什么POJO中变量不能用is开头
- 关于数组的 slice() 和 splice() 方法
- 苹果可折叠iPhone有望在2023年推出 支持手写笔
- 20051129: NetBeans
- AWT事件处理机制 --Java
- Android开发实战手把手教你实现一个折叠式布局
- png格式的图片怎么变成jpg格式?png图片怎么转格式?
- 假币问题POJ2692
- button loading indicators
- 我的世界java版如何装mod_我的世界MOD安装详解教程 全方位介绍MOD
- vscode找不到执行文件导致更新失败
- 揭秘:腾讯、字节跳动面经已发,妈妈再也不用担心我找工作了!
热门文章
- 没有匹配 if 的非法 else_求求你,别再写这么多if...else...了
- mysql userstat_mysql 中记录用户登录错误日志方法小结
- js轮播图代码_javascript基础(一)——轮播图
- Mysql共享锁实例_mysql共享锁与排他锁用法实例分析
- c++十六进制加法_C++中输出十六进制形式的字符串
- python netty_Netty源码解读(一)概述
- 19、计算机图形学——蒙特卡洛路径追踪
- php制作本地程序,PHP安装程序制作
- class不生效 weblogic_weblogic下更改jsp不生效的解决办法
- Ubuntu架设FTP