美思 [PHP] 程式設計教學:字串 (String)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

在電腦程式中,字串型態用來儲存文字資料 (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 甚至將常規表示式內建在語法中。

限於篇幅,這裡不說明常規表示式的撰寫和使用方式。日後有機會再另寫專文來介紹。

關於作者

身為資訊領域碩士,美思認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

美思喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,美思將所學寫成文章,放在這個網站上和大家分享。