原文: https://zetcode.com/lang/php/strings/

在 PHP 编程教程的这一部分中,我们将更详细地处理字符串数据。

字符串是计算机语言中非常重要的数据类型。 这就是为什么我们将一整章专门讨论在 PHP 中使用字符串的原因。

PHP 字符串字面值

字符串字面值是表示计算机程序文本内的字符串值的符号。 在 PHP 中,可以使用单引号,双引号或使用 heredoc 或 nowdoc 语法创建字符串。

literals.php

  1. <?php
  2. $a = "PHP";
  3. $b = 'PERL';
  4. echo $a, $b;

在此代码示例中,我们创建两个字符串并将它们分配给$a$b变量。 我们用echo关键字打印它们。 第一个字符串使用双引号定界符创建,第二个字符串使用单引号定界符。

下一个示例将使用 heredoc 语法创建一个字符串。 Heredoc 保留文本中的换行符和其他空格(包括缩进)。 heredoc 使用<<<来创建,后跟定界标识符,然后从下一行开始,在要引用的文本之后,再在同一行中以相同的标识符关闭。 结束标识符不能缩进。 它只能包含字母数字字符和下划线,并且必须以非数字字符或下划线开头。

heredoc.php

  1. <?php
  2. $str = <<<TEXT
  3. "That is just as I intended." Vautrin said. "You know quite well what
  4. you are about. Good, my little eaglet! You are born to command, you
  5. are strong, you stand firm on your feet, you are game! I respect you."
  6. TEXT;
  7. echo $str, "\n";

该示例打印直接语音的示例。

  1. $ php heredoc.php
  2. "That is just as I intended." Vautrin said. "You know quite well what
  3. you are about. Good, my little eaglet! You are born to command, you
  4. are strong, you stand firm on your feet, you are game! I respect you."

这是示例的输出。

nowdoc 的指定方式与 Heredoc 相似,但是在 nowdoc 内部未进行任何解析。 nowdoc 的标识与 Heredocs 所使用的序列相同<<<,但是后面的标识符用单引号引起来,例如<<<'TEXT'

nowdoc.php

  1. <?php
  2. $str = <<<'TEXT'
  3. Fear is among the greatest obstacles which prevent us from enjoying life
  4. to its fullest extent. Since of the most commonly held fears among
  5. people are the fear of heights and the fear of falling from heights.
  6. Rock climbing is a fantastic way to conquer these fears.
  7. TEXT;
  8. echo $str, "\n";

该示例使用 nowdoc 语法打印三个句子。

  1. $ php nowdoc.php
  2. Fear is among the greatest obstacles which prevent us from enjoying life
  3. to its fullest extent. Since of the most commonly held fears among
  4. people are the fear of heights and the fear of falling from heights.
  5. Rock climbing is a fantastic way to conquer these fears.

这是nowdoc.php脚本的输出。

PHP 插值

变量被插入双引号中的字符串中。

interpolation.php

  1. <?php
  2. $quantity = 5;
  3. echo "There are $quantity roses in the vase\n";

$quantity变量将在字符串输出中替换为其值。

  1. $ php interpolation.php
  2. There are 5 roses in the vase

这是interpolation.php脚本的输出。

当变量名称位于另一个字符旁边时,可以使用大括号。

curlybraces.php

  1. <?php
  2. $quantity = 5;
  3. $item_name = "rose";
  4. echo "There are $quantity {$item_name}s in the vase\n";

没有花括号,PHP 解释器将查找$item_names变量,该变量不存在。

  1. $ php curlybraces.php
  2. There are 5 roses in the vase

这是curlybraces.php脚本的输出。

PHP 字符串连接

PHP 使用点.运算符来连接字符串。

  1. php > echo "PHP " . "language\n";
  2. PHP language

该示例连接了两个字符串。

  1. php > $a = "Java ";
  2. php > $a .= "language\n";
  3. php > echo $a;
  4. Java language

PHP 还支持.=复合运算符。

PHP 转义字符

转义字符是指定用于对字符序列中紧随其后的字符调用替代解释的单个字符。

  1. php> echo " bbb\raaa";
  2. aaabbb

回车\r是控制字符,用于将行尾返回到行首。

strophe.php

  1. <?php
  2. echo "Incompatible, it don't matter though\n'cos someone's bound to hear my cry\n";
  3. echo "Speak out if you do\nYou're not easy to find\n";

新行是一个控制字符,它开始一行新文本。

  1. $ php strophe.php
  2. Incompatible, it don't matter though
  3. 'cos someone's bound to hear my cry
  4. Speak out if you do
  5. You're not easy to find

这是strophe.php脚本的输出。

  1. php> echo "Towering\tinferno\n";
  2. Towering inferno

水平选项卡在文本之间放置一个空格。

  1. "Johnie's dog"
  2. 'Johnie\'s dog'

单引号和双引号可以嵌套。 或者,如果仅使用单引号,则可以使用反斜杠来转义单引号的默认含义。

backslash.php

  1. <?php
  2. $text = "
  3. \"That is just as I intended.\" Vautrin said. \"You know quite well what
  4. you are about. Good, my little eaglet! You are born to command, you
  5. are strong, you stand firm on your feet, you are game! I respect you.\"
  6. ";
  7. echo $text;

在此示例中,我们有一个多行文本,其中包括直接语音。 双引号用反斜杠字符转义。

  1. php> $var = 233;
  2. php> echo "$var";
  3. 233
  4. php> echo "\$var is $var";
  5. $var is 233

美元符号$在 PHP 中也有特殊含义; 它表示一个变量。 如果在字符串中使用了变量,则会对其进行插值,即使用变量的值。 为了回显变量名,我们转义了$字符\$

PHP 字符串操作

PHP 具有大量有用的有用内置函数,可用于处理字符串。

  1. echo strlen("Eagle"); # prints 5
  2. echo strtoupper("Eagle"); # prints EAGLE
  3. echo strtolower("Eagle"); # prints eagle

在这里,我们使用三个函数。 strlen()函数返回字符串中的许多字符。 strtoupper()将字符转换为大写字母,strtolower()将字符转换为小写字母。

letters.php

  1. <?php
  2. $sentence = "There are 22 apples";
  3. $alphas = 0;
  4. $digits = 0;
  5. $spaces = 0;
  6. $length = strlen($sentence);
  7. for ($i = 0; $i < $length; $i++) {
  8. $c = $sentence[$i];
  9. if (ctype_alpha($c)) $alphas++;
  10. if (ctype_digit($c)) $digits++;
  11. if (ctype_space($c)) $spaces++;
  12. }
  13. echo "There are $length characters.\n";
  14. echo "There are $alphas alphabetic characters.\n";
  15. echo "There are $digits digits.\n";
  16. echo "There are $spaces spaces.\n";

在我们的示例中,我们有一个字符串句子。 我们计算句子中的绝对字符数,字母字符数,数字和空格。 为此,我们使用以下函数:strlen()ctype_alpha()ctype_digit()ctype_space()

  1. $ php letters.php
  2. There are 19 characters.
  3. There are 14 alphabetic characters.
  4. There are 2 digits.
  5. There are 3 spaces.

这是letters.php脚本的输出。

接下来,我们介绍substr()函数。

  1. echo substr("PHP language", 0, 3); # prints PHP
  2. echo substr("PHP language", -8); # prints language

该函数返回字符串的一部分。 第一个参数是指定的字符串。 第二个参数是子字符串的开头。 第三个参数是可选的。 它是返回的子字符串的长度。 默认值为返回到字符串末尾。

str_repeat()函数将字符串重复指定的次数。

repeat.php

  1. <?php
  2. echo str_repeat("#", 18);
  3. echo "\nProject Neurea\n";
  4. echo "Priority high\n";
  5. echo "Security maximum\n";
  6. echo str_repeat("#", 18);
  7. echo "\n";

我们使用str_repeat()函数创建两行#字符。

  1. $ php repeat.php
  2. ##################
  3. Project Neurea
  4. Priority high
  5. Security maximum
  6. ##################

这是repeat.php脚本的输出。

在下一个示例中,我们将随机修改一个字符串。

shuffling.php

  1. <?php
  2. $string = "ZetCode";
  3. echo str_shuffle($string), "\n";
  4. echo str_shuffle($string), "\n";
  5. echo str_shuffle($string), "\n";
  6. echo str_shuffle($string), "\n";
  7. echo str_shuffle($string), "\n";
  8. echo str_shuffle($string), "\n";
  9. echo str_shuffle($string), "\n";

str_shuffle()随机随机播放一个字符串。

  1. $ php shuffling.php
  2. ZtCeoed
  3. eodtCZe
  4. toZeeCd
  5. oCdeteZ
  6. edtCZoe
  7. tdeCeoZ
  8. oeZdteC

这是shuffling.php脚本的示例输出。

explode()函数用于将字符串分成多个部分。 它返回一个分割字符串部分的数组。

exploding.php

  1. <?php
  2. $nums = "1,2,3,4,5,6,7,8,9,10,11";
  3. $vals = explode(",", $nums);
  4. $len = count($vals);
  5. echo "There are $len numbers in the string\n";

字符串中包含整数,并用逗号分隔。 我们计算整数的数量。

  1. $vals = explode(",", $nums);

在这里,我们使用explode()函数分割文本。 每当找到点,字符时,该函数就会将其切成小段。

  1. $ php exploding.php
  2. There are 11 numbers in the string

示例的输出。

teams1.php

  1. <?php
  2. echo "Ajax Amsterdam" . " - " . "Inter Milano " . "2:3\n";
  3. echo "Real Madridi" . " - " . "AC Milano " . "3:3\n";
  4. echo "Dortmund" . " - " . "Sparta Praha ". "2:1\n";

我们用点运算符连接字符串。

  1. $ php teams1.php
  2. Ajax Amsterdam - Inter Milano 2:3
  3. Real Madridi - AC Milano 3:3
  4. Dortmund - Sparta Praha 2:1

输出不是最佳的。 我们将对其进行更改,以使其看起来更整洁。

teams2.php

  1. <?php
  2. $teams = array(
  3. array("Ajax Amsterdam", "Inter Milano"),
  4. array("Real Madrid", "AC Milano"),
  5. array("Dortmund", "Sparta Praha")
  6. );
  7. $results = array("2:3", "3:3", "2:1");
  8. $i = 0;
  9. foreach ($teams as $team) {
  10. echo str_pad($team[0], 14);
  11. echo str_pad("-", 3, " ", STR_PAD_BOTH);
  12. echo str_pad($team[1], 14);
  13. echo str_pad($results[$i], 3, " ", STR_PAD_LEFT);
  14. echo "\n";
  15. $i++;
  16. }

我们使用str_pad()函数改善了输出格式。 它将在字符串的左侧,右侧或两侧添加指定的字符串(在我们的示例中为空格)。

  1. $ php teams2.php
  2. Ajax Amsterdam - Inter Milano 2:3
  3. Real Madrid - AC Milano 3:3
  4. Dortmund - Sparta Praha 2:1

我们设法提供了更好的格式化输出。

字符数组

PHP 中的字符串是一个字符数组。

array_of_chars.php

  1. <?php
  2. $site = "zetcode.com";
  3. for ($i=0; $i < strlen($site); $i++) {
  4. $o = ord($site[$i]);
  5. echo "$site[$i] has ASCII code $o\n";
  6. }

在示例中,我们遍历字符串并打印每个字符的 ASCII 码。

  1. $site = "zetcode.com";

定义了一个字符串。 它包含十一个字符。

  1. for ($i=0; $i < strlen($site); $i++) {
  2. $o = ord($site[$i]);
  3. echo "$site[$i] has ASCII code $o\n";
  4. }

我们使用for循环遍历字符串。 字符串的大小由strlen()函数确定。 ord()函数返回字符的 ASCII 值。 我们使用数组索引符号来获取字符。

  1. $ php array_of_chars.php
  2. z has ASCII code 122
  3. e has ASCII code 101
  4. t has ASCII code 116
  5. c has ASCII code 99
  6. o has ASCII code 111
  7. d has ASCII code 100
  8. e has ASCII code 101
  9. . has ASCII code 46
  10. c has ASCII code 99
  11. o has ASCII code 111
  12. m has ASCII code 109

这是array_of_chars.php示例的输出。

PHP 字符串格式化

字符串格式化或字符串插值是将各种值动态地放入字符串中。

fruits.php

  1. <?php
  2. printf("There are %d oranges and %d apples in the basket.\n", 12, 32);

我们使用%d格式说明符。 指定者希望传递一个整数值。

  1. $ php fruits.php
  2. There are 12 oranges and 32 apples in the basket.

在下一个示例中,我们传递一个float和一个字符串值。

height.php

  1. <?php
  2. printf("Height: %f %s\n", 172.3, "cm");

浮点值的格式说明符为%f,字符串为%s

  1. $ php height.php
  2. Height: 172.300000 cm

我们可能不喜欢上面示例中的数字默认情况下具有 6 个小数位的事实。 我们可以控制格式说明符中的小数位数。

height2.php

  1. <?php
  2. printf("Height: %.1f %s\n", 172.3, 'cm');

小数点后跟一个整数控制小数位数。 在我们的例子中,数字恰好有一位小数。

  1. $ php height2.php
  2. Height: 172.3 cm

下面的示例显示其他格式设置选项。

formatting.php

  1. <?php
  2. # hexadecimal
  3. printf("%x\n", 300);
  4. # octal
  5. printf("%o\n", 300);
  6. # scientific
  7. printf("%e\n", 300000);

第一种格式适用于十六进制数字。 x字符以十六进制格式格式化数字。 o字符以八进制格式显示数字。 e字符以科学格式显示数字。

  1. $ php formatting.php
  2. 12c
  3. 454
  4. 3.000000e+5

下一个示例显示三列数字。

columns.php

  1. <?php
  2. foreach (range(1,11) as $num) {
  3. echo $num , " ", $num*$num, " ",
  4. $num*$num*$num, "\n";
  5. }

数字左对齐,输出不整齐。

  1. $ php columns.php
  2. 1 1 1
  3. 2 4 8
  4. 3 9 27
  5. 4 16 64
  6. 5 25 125
  7. 6 36 216
  8. 7 49 343
  9. 8 64 512
  10. 9 81 729
  11. 10 100 1000
  12. 11 121 1331

为了解决这个问题,我们使用宽度说明符。 宽度说明符定义对象的最小宽度。 如果对象小于宽度,则将填充空格。

columns2.php

  1. <?php
  2. foreach (range(1,11) as $num) {
  3. printf("%2d %3d %4d\n", $num, $num*$num, $num*$num*$num);
  4. }

现在输出看起来正常。 数字 2 表示第一列的宽度为 2 个字符。

  1. $ php columns2.php
  2. 1 1 1
  3. 2 4 8
  4. 3 9 27
  5. 4 16 64
  6. 5 25 125
  7. 6 36 216
  8. 7 49 343
  9. 8 64 512
  10. 9 81 729
  11. 10 100 1000
  12. 11 121 1331

PHP 教程的这一部分介绍了字符串。