前言
在電腦程式中,字串型態用來儲存文字資料 (text data)。我們第一次提到字串是在資料型態的章節。但字串相關內容較多,故另闢一章來說明。
建立字串實字 (String Literal)
字串實字以一對單引號或雙引號來建立。以下 PHP 程式建立單引號字串 (single-quoted string):
<?php
$s = 'A single-quoted string';
以下 PHP 程式建立雙引號字串 (double-quoted string):
<?php
$s = "A double-quoted string";
兩者的差別在於雙引號字串有跳脫序列和變數安插,而單引號字串無。詳見下文。
跳脫序列 (Escape Sequences)
跳脫序列是在雙引號字串中出現的特殊字元。像是以下程式在行尾附加換行 (return):
<?php
echo "A double-quoted string", "\n";
但對單引號字串使用跳脫序列是無意義的:
<?php
echo 'A single-quoted string', '\n';
在單引號字串中,跳脫序列會原封不動地印出來。讀者可以在自已電腦上實際跑跑看便知。
使用單引號字串時,仍可在其後加上雙引號字串,在後者加入跳脫序列:
<?php
echo 'A single-quoted string', "\n";
以下是常見的跳脫序列:
字元 | 意義 |
---|---|
\n |
換行 |
\r |
回車 |
\t |
TAB 鍵 |
\' |
' (單引號) |
\" |
" (雙引號) |
\\ |
\ (反斜線) |
"\r"
甚少單獨使用,比較常見的使用方式是在 Windows 上用 "\r\n"
當成換行符號。但在 Unix 上的換行只用 "\n"
。著眼於這個議題,PHP 提供內建變數 PHP_EOL
,這個變數會在宿主平台上提供合適的換行字元。將前述程式改寫如下:
<?php
echo 'A single-quoted string', PHP_EOL;
\'
是為了在單引號字串中使用單引號本身的寫法,使用實例如下:
<?php
echo 'It\'s raining.', PHP_EOL;
避開這種寫法的方式是改用雙引號字串,並在字串中使用單引號::
<?php
echo "It's raining.", PHP_EOL;
同理,在單引號字串中使用雙引號,就不需使用跳脫序列:
<?php
echo '"PHP is awesome, right?", she said.', PHP_EOL;
變數安插 (String Interpolation)
雙引號字串中可放入變數,變數的部分會自動以其值代換掉。先前在寫 if
敘述時就看過這個例子了:
<?php
# Get a random number between 1 and 10.
$number = rand(1, 10);
# Check whether the number is even or odd.
if (0 == $number % 2) {
echo "$number is even";
}
else {
echo "$number is odd";
}
建立 Heredoc 和 Nowdoc
先前談到的字串是單行字串,要換行需自行加入 PHP_EOL
等換行符號。PHP 也允許多行字元。
Heredoc 是雙引號字串的多行字串版本。以下是一個使用實例:
<?php
$name = "Michelle";
$age = 28;
$job = "an indie developer";
echo <<<END
My name is $name.
I am $age year-old.
I work as $job.
END;
建立 heredoc 時,要先自行設置結束的符號,此處是 END
。之後所有的文字都視為多行字串的一部分。在其中同樣可以進行變數安插。第二次碰到結束符號時,即結束多行字串。
要注意結束符號 END
要貼著 PHP 命令稿的最左側,不可以留空白。此外,結束符號視為敘述結束,其後要加 ;
(分號)。
Nowdoc 則是單引號字串的多行字串版本。其寫法和 heredoc 略有不同:
<?php
$s = <<<'END'
foo
bar
baz
END;
主要的差別是指定結束符號時要以一對單引號括住,用來和 heredoc 區隔。就像此處的 'END'
。
字串相接
PHP 的字串無法直接安插表達式 (expression),這時候要用字串相接將字串逐一接起來。字串相接的運算子為 .
(dot)。以下是實際使用範例:
<?php
$a = 4;
$b = 3;
echo "$a + $b = " . ($a + $b) . PHP_EOL;
echo "$a - $b = " . ($a - $b) . PHP_EOL;
echo "$a * $b = " . ($a * $b) . PHP_EOL;
echo "$a / $b - " . ($a / $b) . PHP_EOL;
在使用 echo
輸出字串時,也可以使用 ,
:
<?php
$a = 4;
$b = 3;
echo "$a + $b = ", $a + $b, PHP_EOL;
echo "$a - $b = ", $a - $b, PHP_EOL;
echo "$a * $b = ", $a * $b, PHP_EOL;
echo "$a / $b - ", $a / $b, PHP_EOL;
因為 echo
可接收不特定數量參數,使用 ,
表示放入多個參數。
操作字串
PHP 內建多個操作字串的函式。限於篇幅,本文不特別介紹。讀者可先自行瀏覽一下,知道有那些函式。
字串低階操作
必要時,可以將字串依個別字元拆成字元陣列:
<?php
$arr = str_split("Hello World");
foreach ($arr as $char) {
echo $char, PHP_EOL;
}
將字串拆成字元陣列後,就可以使用一些字串相關演算法對字元陣列進行運算。最後再用 implode 將字串接起來。以下是假想的運算過程:
<?php
$arr = str_split("Hello World");
# Do some computation on `$arr`.
# Join the character array.
$s = implode("", $arr);
但 str_split
僅適用於英文。如果要拆開 CJK (中日韓) 字串,則要使用常規表示式:
<?php
$arr = preg_split("//u", "你好,世界", null, PREG_SPLIT_NO_EMPTY);
foreach ($arr as $char) {
echo $char, PHP_EOL;
}
常規表示式 (Regular Expression)
常規表示式是用在樣式比對 (pattern matching) 的小型語言。其實常規表示式不是 PHP 限定的功能,大部分高階語言都有常規表示式的函式庫,少數語言像是 Perl、Ruby 甚至將常規表示式內建在語法中。
限於篇幅,這裡不說明常規表示式的撰寫和使用方式。日後有機會再另寫專文來介紹。