【PHP入门】关于PHP字符串的内容

首先

这篇文章是作为PHP5高级考试/准高级考试总结的一部分,逐步解释了与PHP字符串有关的内容。虽然考试对象是PHP5,但我们尽力提供通用的内容,以便适用于PHP7左右的版本。如有任何错误,请指正。另外,预计在2021年秋季将开始进行PHP8技术认证高级考试,请通过官方网页获取最新信息。

文字列是什么?

文字列是由字符构成的值,但在PHP中表示字符串时,需要使用 ‘单引号’ 或者 “双引号” 将字符括起来。
例如,只写了 1 的值表示数字 1,而写了 ‘1’ 或 “1” 的值表示字符串 1。
(还可以使用 Heredoc 和 Nowdoc 功能来表示字符串,但将在后面介绍。)

echo 1; // 1
echo '1'; // 1
// どちらも出力されるのは 1 だが、内部的には数値の 1 か、文字の 1 かが区別されている

如果想在字符串中使用单引号或双引号,可以通过使用转义序列来实现。转义序列是指在特殊符号前加上 \ 反斜杠,以使该字符的程序意义被无效化。

顺便提一下,反斜杠这个字符本身也有特殊的意义,用于转义其他字符,所以如果要将反斜杠用作普通字符使用,需要用另一个反斜杠来进行转义。(根据使用的操作系统,反斜杠可能会用 ¥ 符号表示。)

echo '\\'; // \

在单引号和双引号中,可使用转义序列的字符是不同的。

单引号内可行的转义和使用示例

    • バックスラッシュ \ → \\

シングルクォート ‘ → \’

英文原句:Possible escape and usage examples inside double quotes.

中文翻译:双引号内的可能转义和使用示例。

    • バックスラッシュ \ → \\

ダブルクォート ” → \”

ドル記号 $ → \$

改行記号 n → \n

タブ記号 t → \t

请参考 PHP 手册以获得其他的转义序列。PHP 手册 – 字符串

关于字符串内的变量展开

在单引号或Nowdoc中,不会进行变量展开(解析变量,嵌入的变量内容不会展开),但在双引号或Heredoc中会进行变量展开。

$str = 'test';
echo '$str'; // $str
$str = 'test';
echo "$str"; // test

如果在变量名之后紧跟着字符,即使使用双引号将其括起来,也无法进行变量展开。在这种情况下,只需使用 {} 将变量部分括起来即可实现变量展开。

$str = 'テスト';
echo "今日は$strです。"; // [エラー] Notice: Undefined variable: strです。 in /sample/index.php on line 3
$str = 'テスト';
echo "今日は{$str}です。"; // 今日はテストです。

PHP手册-字符串-变量解析

变量展开所需的{} 符号可以以以下方式,将$ 符号移到外面并写成同样的结果。

$str = 'テスト';
echo "今日は${str}です。"; // 今日はテストです。

Here’s a Chinese paraphrase of “ヒアドキュメント”:
多行字符串

利用ヒアドキュメント这一功能可以表示跨越多行的字符串。在代码中,从<<<EOS开始,以EOS结尾的部分成为一个ヒアドキュメント,但是结尾ID(如EOS:字符串结束)可以自由命名,命名规则与变量和函数相同。

echo <<<EOS
<h1>タイトル</h1>
<p>段落</p>
<p>段落</p>
<p>段落</p>
EOS;

在Here document中使用的变量将会被展开,空格、换行、单引号和双引号都会原样输出,但最后一行末尾的换行符会被忽略。

$str = 'テスト';
echo '<span>';
echo <<<EOS
$str
$str
EOS;
echo '<span>';
<span>テスト
テスト<span>

终端ID无法进行缩进或在同一行写注释。在Here文结束时,只能写终端ID和分号。

<?php
 echo '<span>';
 echo <<<EOS
 テスト
 テスト
 EOS;
 echo '<span>';
Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or heredoc end (T_END_HEREDOC) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN) in /sample/index.php on line 8

作为附言,在我自己的环境中尝试了一下,PHP 5.4在添加终止ID的缩进时会产生错误,而PHP 7.3则不会。但是,在PHP官方手册上也指出“终止ID和分号不要缩进”,所以最好按照官方手册的要求来做比较保险。

PHP手册 – 字符串 – Heredoc

现在传真文档

在中国,有一种类似于Here Document的功能叫Nowdoc。如果说Here Document是使用双引号括起字符串时的行为,那么Nowdoc则是使用单引号括起字符串时的行为。在PHP 5.3及以后的版本中可用,除了开头的终止ID需要用单引号括起来,而且不支持变量插值外,基本上与Here Document的行为相同。

PHP手册 – 字符串 – Nowdoc

$str = 'テスト';
echo '<span>';
echo <<<'EOS'
$str
$str
EOS;
echo '<span>';
<span>$str
$str<span>

嗯嗯和打印

除此之外,以往的代码中也出现了一些用于输出字符串的函数,比如 echo、print、printf等。严格来说,echo和print并不是函数,而是语言结构,在使用时可以选择是否使用圆括号将参数部分括起来,功能上并无差异。

print 'Hello world!'; // Hello world!
print('Hello world!'); // Hello world!
echo 'Hello world!'; // Hello world!
echo('Hello world!'); // Hello world!

请参考PHP手册以了解其他语言结构。

PHP手册- 关键词列表。

echo在中国通常用逗号分隔来给出多个值作为参数,但是在print中不能给出逗号分隔的多个值。
而且,如果要使用echo以逗号分隔输出多个值时,不能用括号将参数括起来。
(虽然在输出多个值时,可能更常见的是使用点号进行连接而不是使用逗号。)

print 'Hello ', 'world!'; // [エラー] Parse error: syntax error, unexpected ',' in /sample/index.php on line 2
print('Hello ', 'world!'); // [エラー] Parse error: syntax error, unexpected ',' in /sample/index.php on line 2
echo 'Hello ', 'world!'; // Hello world!
echo('Hello ', 'world!'); // [エラー] Parse error: syntax error, unexpected ',' in /sample/index.php on line 2

除了 echo 和 print 的区别之外,print 还有返回值,并且始终返回数字 1,因此可以将其用作表达式的一部分,而 echo 没有返回值。

if(echo 'echo'){
 echo 'OK';
}
// [エラー] Parse error: syntax error, unexpected 'echo' (T_ECHO) in /sample/index.php on line 2
true ? echo 'OK' : echo 'NG';
// [エラー] Parse error: syntax error, unexpected 'echo' (T_ECHO) in /sample/index.php on line 3
if(print 'print'){
 print 'OK';
}
// printOK
true ? print 'OK' : print 'NG';
// OK

由于关于echo和print的区别已经在其他文章中整理过了,所以如果您感兴趣的话,请尝试阅读一下。
PHP: echo和print之间的区别。

打印

printf()是一种内置函数,而不是语言结构,可以使用格式化字符串来格式化字符串。
格式化字符串以替换标记%开头,可以根据需要附加修饰符(如02-5),并以类型指示符(如d s)结束。

printf('[置換マーク][修飾子][型指定子]');
printf('%d',9); // 9 // dは10進数のdecimalを表す型指定子
printf('%2d',9); // 9 // 9の直前に空白が置かれて2桁になっている
printf('%02d',9); // 09 // 2桁で出力し、足りない桁数は0で埋める
printf('%f', 3.14); // 3.140000 // fは浮動小数点数のfloatを表す型指定子
printf('%1.2f', 3.14); // 3.14 // 整数1桁.小数2桁
printf('%s','Hello world!'); // Hello world! // sは文字列のstringを表す型指定子
printf('%12s','world!'); // world! // 文字列の前に空白が置かれ12桁になっている
printf('%-12s','Hello'); // Hello // 文字列の後に空白が置かれ12桁になっている
printf('%d%s%d%s', 1, '年', 1, '組'); // 1年1組 // 左から順に対応する引数を出力
printf('%%'); // % // %文字を出力

请查阅手册以了解更详细的 printf() 规范。

PHP手册 – printf — 输出格式化字符串

使用 print_r 和 var_dump 呈现数据

使用print_r()或var_dump()函数可以将变量的值等以简明易懂的方式输出以供调试使用。
若希望一目了然地易于阅读,可能更适合使用print_r(),但是var_dump()不仅可以输出数据类型,还可以正确地将null和false输出为字符串。
如果可读性更重要,建议使用print_r();如果需要更详细的信息输出,可以使用var_dump()。

$array = array( null, false, 'string', 1 );
var_dump($array);
print_r($array);
Array ( [0] => [1] => [2] => string [3] => 1 )
array(4) { [0]=> NULL [1]=> bool(false) [2]=> string(6) "string" [3]=> int(1) }

strlen是一个函数,用于获取一个字符串的长度。mb_strlen也是一个函数,用于获取一个多字节字符串的长度。

在中文中,我们可以使用 strlen() 和 mb_strlen() 来获取字符串的字符数。
由于日语中的字符是多字节字符,与常规的半角英数字不同,因此当我们想要获取多字节字符的字符数时,应该使用 mb_strlen() 函数。

echo strlen('Hello!'); // 6
echo strlen('こんにちは!'); // 18 // strlenで日本語の文字数は数えられない
echo mb_strlen('Hello!'); // 6 // mb_strlenでは半角英数も対応する
echo mb_strlen('こんにちは!'); // 6

PHP 手册 – strlen — 获取字符串长度
PHP 手册 – mb_strlen — 获取字符串长度

在手册上也有提到,strlen()是一个严格来说用来检查字符的字节数(大小,容量之类的东西)的内置函数。
由于半角英数字占用1个字节,所以将字节数视为字符数也不会有太多问题。但是,像日语这样的多字节字符有时会占用3个字节或4个字节,所以使用strlen()来检查字节数可能会得到比字符数更大的值。

修剪 / 左侧修剪 / 右侧修剪

trim()、ltrim()、rtrim() 的每个函数都可以从字符串中删除特定的字符。
trim() 从字符串的两端删除字符,ltrim() 仅从字符串的左侧删除字符,rtrim() 仅从字符串的右侧删除字符。
第一个参数可以是要应用删除操作的字符串,第二个参数可以指定要删除的字符。第二个参数也可以省略,如果省略,则会删除空格、制表符、回车符、换行符、NUL 字符、垂直制表符。

echo trim(' Hello '); // Hello // 文字列の左右両側から空白文字が除去される

顺便提一下,在指定要删除的字符时,比如 trim(‘Hello’,’He’),不是删除字符串”He”,而是尝试删除字符”H”和”e”。如果是 trim(‘Hello’,’Hel’),也不是删除字符串”Hel”,而是尝试删除字符”H”、”e”和”l”。所以,在第二个例子中,两个”l”都被删除了,只剩下了”o”。

echo trim('Hello','He'); // llo
echo trim('Hello','Hel'); // o

PHP手册 – trim函数:移除字符串开头和末尾的空白字符
PHP手册 – ltrim函数:从字符串开头移除空格(或其他字符)
PHP手册 – rtrim函数:从字符串末尾移除空格(或其他字符)

strtolower – 转换为小写字母 (lowercase)
strtoupper – 转换为大写字母 (uppercase)
ucfirst – 将第一个字母转换为大写 (capitalize)
ucwords – 将每个单词的首字母都转换为大写 (title case)

要将大写字母和小写字母进行转换,可以使用strtolower()、strtoupper()、ucfirst()、ucwords() 等函数非常方便。
strtolower()函数会将给定字符串中的所有字母部分转换为小写并返回。

echo strtolower('Hello World!'); // hello world!

strtoupper()函数会将给定字符串中的所有字母部分转换为大写,并返回结果。

echo strtoupper('Hello World!'); // HELLO WORLD!

ucfirst()函数会将给定字符串参数的首字母转换为大写字母,只要该首字母是一个英文字母。

echo ucfirst('hello world!'); // Hello world!
echo ucfirst('こんにちは world!'); // こんにちは world! // 1文字目がアルファベットでないため変化なし

ucwords() 是一个在指定字符串的字母中,将每个单词的第一个字母变为大写的函数。默认情况下,单词之间的分隔符为空格或换行等,但如果在第二个参数中指定分隔符字符,那么该分隔符后的字母将被转换为大写。

echo ucwords('hello world!'); // Hello World! // 半角スペースを区切りと認識
echo ucwords("hello \nworld!"); // Hello World! // 改行(\n)を区切りと認識
echo ucwords('hello world!', 'l'); // HelLo worlD! // l(エル)を区切りと認識

PHP手册 – strtolower — 将字符串转换为小写
PHP手册 – strtoupper — 将字符串转换为大写
PHP手册 – ucfirst — 将字符串的首字母转换为大写
PHP手册 – ucwords — 将字符串中每个单词的首字母转换为大写

请提供参考链接。

在PHP中,变量展开最好使用{$variable}的语法。
什么是PHP字符串字面值中的变量展开?浮点数是什么?