「PHPの基礎 - 文字列」の版間の差分
(→文字列の連結) |
(→変数展開) |
||
161行目: | 161行目: | ||
<br><br> | <br><br> | ||
== | == 全角・半角 == | ||
全角・半角が混ざった文字列を正確にカウントする場合、いくつかの方法が存在する。<br> | |||
必ず、エンコーディング (UTF-8等) を指定する必要があることに注意する。<br> | |||
<br> | <br> | ||
また、全角・半角を区別してカウントする場合は、正規表現を使用することができる。<br> | |||
<br> | |||
==== mb_strlen関数の使用 ==== | |||
これは、簡便で高速な方法である。<br> | |||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
$ | $str = "1 あ イ"; | ||
echo " | |||
$count1 = mb_strlen($str, 'UTF-8'); | |||
echo "mb_strlen(): " . $count1 . "\n"; // 結果: 5 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== preg_match_all関数を使用して文字単位でカウント ==== | |||
より複雑なパターンマッチングが必要な場合に使用する。<br> | |||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
$ | $str = "1 あ イ"; | ||
echo " | |||
$count2 = preg_match_all('/./u', $str, $matches); | |||
echo "preg_match_all(): " . $count2 . "\n"; // 結果: 5 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== 配列に分解してカウント ==== | |||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
$ | $str = "1 あ イ"; | ||
echo " | |||
$array = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY); | |||
$count3 = count($array); | |||
echo "preg_split(): " . $count3 . "\n"; // 結果: 5 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
< | ==== mb_str_split関数の使用 (PHP 7.4以降) ==== | ||
< | 文字列を配列に分解できるため、文字ごとの処理が必要な場合に便利である。<br> | ||
<syntaxhighlight lang="php"> | |||
$str = "1 あ イ"; | |||
$array2 = mb_str_split($str); | |||
$count4 = count($array2); | |||
echo "mb_str_split(): " . $count4 . "\n"; // 結果: 5 | |||
</syntaxhighlight> | |||
<br> | |||
==== 空白を除外してカウント ==== | |||
<syntaxhighlight lang="php"> | |||
$str = "1 あ イ"; | |||
$count_no_spaces = mb_strlen(str_replace(' ', '', $str), 'UTF-8'); | |||
echo "空白を除外: " . $count_no_spaces . "\n"; // 結果: 3 | |||
</syntaxhighlight> | |||
<br> | |||
==== 文字種別ごとにカウント ==== | |||
<syntaxhighlight lang="php"> | |||
$str = "1 あ イ"; | |||
$zenkaku_count = preg_match_all('/[ぁ-んァ-ンー一-龠]/u', $str, $matches); | |||
$hankaku_count = preg_match_all('/[\x{FF01}-\x{FF5E}]/u', $str, $matches); | |||
$space_count = mb_substr_count($str, ' '); | |||
echo "全角文字数: " . $zenkaku_count . "\n"; // 結果: 1 | |||
echo "半角カナ数: " . $hankaku_count . "\n"; // 結果: 1 | |||
echo "空白文字数: " . $space_count . "\n"; // 結果: 2 | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
2024年11月9日 (土) 01:19時点における版
概要
PHPでは複数のデータ型が存在するが、文字の集合を表すために使用されるデータ型が文字列である。
ここでは、文字列の取り扱いを記載する。
文字列リテラル
文字列を記述する場合、文字の集合をシングルクオーテーション'
またはダブルクオーテーション"
で囲む。
なお、''
で囲む場合と""
で囲む場合では、データの扱いが異なる。(詳細は、次のセクションに記載する)
'文字列' "文字列"
複数行に渡る文字列を作成するには、ヒアドキュメントを使用することもできる。
ヒアドキュメントは、<<< <ID名>で始まり<ID名>で終わる間に記述する。ID名は、任意の文字列が指定できる。
また、ヒアドキュメントでは、シングルクオーテーション'
、ダブルクオーテーション"
、空白も文字として扱われる。
<<< ID 文字列1 文字列2 文字列3 ID
以下の例では、ID名をDocumentとしている。
<<< Document
こんにちは。<br />
お元気ですか?
Document
文字列の連結
ドット演算子 (.)
文字列と他の文字列を連結して新しい文字列を作成するには、.
を使用する。
単純な文字列結合には、.
や.=
が理解しやすい。
'文字列1'.'文字列2'
以下の例では、2つの文字列を連結して出力している。
print 'こんにちは。'.'お元気ですか?';
$name = '佐藤';
print $name.'さん。こんにちは。';
また、連結した文字列を変数に格納することもできる。
$name = '佐藤' . 'さん';
複合代入演算子 (.=)
単純な文字列結合には、.
や.=
が理解しやすい。
$str = "Hello";
$str .= " World"; // "Hello World"
ダブルクォート内での変数展開
変数を文字列に埋め込む場合は変数展開がよい。
$name = "World";
$greeting = "Hello $name"; // "Hello World"
中括弧を使用した変数展開
変数を文字列に埋め込む場合は変数展開がよい。
$name = "World";
$greeting = "Hello {$name}"; // "Hello World"
sprintf関数の使用
フォーマットを指定する場合はsprintfがよい。
$name = "World";
$greeting = sprintf("Hello %s", $name); // "Hello World"
implode関数 (配列の要素を結合)
配列の要素を結合する場合は、implode
関数を使用する。
$words = ["Hello", "World"];
$greeting = implode(" ", $words); // "Hello World"
文字列の出力(echo, print)
文字列を出力するには、echo
とprint
が存在する。
echo
の書式は、以下の通りである。
echo "" void echo(string $arg1 [, string $... ])
echo
は引数に指定した文字列を出力する。
複数の文字列を続けて出力する場合、カンマ,
で区切って文字列を指定する。
echo 'こんにちは';
echo '出身地:', '東京都';
厳密にいうと、echo
は関数ではなくPHPの言語構造の1つである。
そのため、引数を括弧で括る必要はなく、関数のように括弧で括って記述することもできる。
ただし、複数の文字列を引数に指定する場合、括弧で括らない方がよい。
echo('こんにちは');
print
の書式は、以下の通りである。
print "" int print(string $arg)
print
は、引数に指定した文字列を出力する。echo
とは異なり、複数の引数を指定できない。
また、戻り値として常に1を返す。
print 'こんにちは';
print
もecho
と同様、関数ではなくPHPの言語構造の1つである。
そのため、引数を括弧で括る必要はなく、関数のように括弧で括って記述することもできる。
print('こんにちは');
エスケープシーケンス
文字列として入力できない特殊な文字(改行文字等)が存在する。
このような特殊な文字を入力するために、\記号 + 1文字等を使用して、特殊文字等を記述することができる。
このような特殊な記述方法をエスケープシーケンスと呼ぶ。
エスケープシーケンスとして用意されているものには、以下のようなものがある。
¥n 改行 ¥r キャリッジリターン ¥t タブ ¥¥ ¥文字 ¥$ $文字 ¥( 左括弧 ¥) 右括弧 ¥[ 左括弧 ¥] 右括弧 ¥' シングルクオーテーション ¥" ダブルクオーテーション ¥nnn 8 進数表記 ¥xnn 16 進数表記
エスケープシーケンスは、ダブルクオーテーションで囲まれた文字列の場合にのみ意味を持つ。
例えば、以下のように使用する。
print "こんにちは¥n";
print "名前は¥"伊藤¥"です"; // ダブルクオーテーションで囲まれた文字列の中で"を出力する場合
また、ダブルクオーテーションで囲まれた文字列の中で¥文字を出力する場合、¥¥
と記述する。
※注意
シングルクオーテーションで囲まれた文字列の中でも、以下の2つだけはエスケープシーケンスとして扱われる。
¥' シングルクオーテーション ¥¥ ¥文字
print '出身地は¥'大阪¥'です';
全角・半角
全角・半角が混ざった文字列を正確にカウントする場合、いくつかの方法が存在する。
必ず、エンコーディング (UTF-8等) を指定する必要があることに注意する。
また、全角・半角を区別してカウントする場合は、正規表現を使用することができる。
mb_strlen関数の使用
これは、簡便で高速な方法である。
$str = "1 あ イ";
$count1 = mb_strlen($str, 'UTF-8');
echo "mb_strlen(): " . $count1 . "\n"; // 結果: 5
preg_match_all関数を使用して文字単位でカウント
より複雑なパターンマッチングが必要な場合に使用する。
$str = "1 あ イ";
$count2 = preg_match_all('/./u', $str, $matches);
echo "preg_match_all(): " . $count2 . "\n"; // 結果: 5
配列に分解してカウント
$str = "1 あ イ";
$array = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
$count3 = count($array);
echo "preg_split(): " . $count3 . "\n"; // 結果: 5
mb_str_split関数の使用 (PHP 7.4以降)
文字列を配列に分解できるため、文字ごとの処理が必要な場合に便利である。
$str = "1 あ イ";
$array2 = mb_str_split($str);
$count4 = count($array2);
echo "mb_str_split(): " . $count4 . "\n"; // 結果: 5
空白を除外してカウント
$str = "1 あ イ";
$count_no_spaces = mb_strlen(str_replace(' ', '', $str), 'UTF-8');
echo "空白を除外: " . $count_no_spaces . "\n"; // 結果: 3
文字種別ごとにカウント
$str = "1 あ イ";
$zenkaku_count = preg_match_all('/[ぁ-んァ-ンー一-龠]/u', $str, $matches);
$hankaku_count = preg_match_all('/[\x{FF01}-\x{FF5E}]/u', $str, $matches);
$space_count = mb_substr_count($str, ' ');
echo "全角文字数: " . $zenkaku_count . "\n"; // 結果: 1
echo "半角カナ数: " . $hankaku_count . "\n"; // 結果: 1
echo "空白文字数: " . $space_count . "\n"; // 結果: 2
文字関数
英字の判別(ctype_alpha関数, ctype_alnum関数)
ctype_alpha
関数は、文字列に英字のみが含まれているかどうかを確認する。
boolean ctype_alpha(string text) 引数の文字列に英字だけが含まれているかどうかを確認します。 英字はa~z、A~Zである。 英字のみの文字列の場合はTRUE、英字以外が含まれている場合はFALSEを返す。 引数 text 調べる文字列 戻り値 文字列が全て英字である場合はTRUE、それ以外の場合はFALSEを返す。
ctype_alnum
関数は、英字と数字のみが含まれているかを確認する。
boolean ctype_alnum(string text) 引数の文字列に、英字と数字のみが含まれているかを確認する。 英字はa~z、A~Z、数字は0~9である。 英字と数字のみの文字列の場合はTRUE、英字と数字以外が含まれている場合はFALSEを返す。 引数 text 確認する文字列 戻り値 文字列が全て英字と数字である場合はTRUE、それ以外の場合はFALSEを返す。
<?php
$input_data = $_GET['text1'];
function dispKekka($str)
{
$kekka1 = ctype_alpha($str);
$kekka2 = ctype_alnum($str);
print('調べる文字列は'.$str.'です<br>');
if($kekka1 == TRUE)
{
print('文字列は英字だけが含まれています<br><br>');
}
else
{
if($kekka2 == TRUE)
{
print('文字列は英字及び数字だけが含まれています<br><br>');
}
else
{
print('文字列は英数字以外の文字が含まれています<br><br>');
}
}
}
$str = 'abcdef';
dispKekka($str);
$str = 'abc@def';
dispKekka($str);
$str = 'abc654def';
dispKekka($str);
?>
数字の判別(ctype_digit関数)
ctype_digit
関数は、文字列に数字のみが含まれているかを確認する。
boolean ctype_digit(string text) 文字列に数字だけが含まれているかを確認する。 数字のみの場合はTRUE、数字以外が含まれている場合はFALSEを返す。 引数 text 調べる文字列 戻り値 文字列が全て数字の場合はTRUE、それ以外の場合はFALSEを返す。
※注意
小数点等が含まれている場合もFALSE
となる。この関数では、全ての文字が0~9である必要がある。
引数に指定した値が、数値または数値として有効な文字列かどうかを判別する場合は、
数字または数値文字列の判別(is_numeric
関数)セクションを参照すること。
<?php
function dispKekka($str)
{
$bRet = ctype_digit($str);
print('調べる文字列は'.$str.'です<br>');
if($bRet)
{
print('文字列は数字だけが含まれています<br><br>');
}
else
{
print('文字列は数字以外の文字が含まれています<br><br>');
}
}
$str = '01234';
dispKekka($str);
$str = 'abc998';
dispKekka($str);
$str = '123.45';
dispKekka($str);
?>
大文字・小文字の判別(ctype_upper関数, ctype_lower関数)
ctype_upper
関数を使用して、文字列が全て大文字かどうかを確認する。
また、ctype_lower
関数を使用して、全て小文字かどうかを確認する。
boolean ctype_upper(string text) 引数の文字列が大文字かどうかを確認する。 引数 text 調べる文字列 戻り値 引数の全ての文字が大文字の場合はTRUE、それ以外の場合はFALSEを返す。 英字以外の文字が含まれている場合はFALSEとなる。 例えば、数字が含まれている場合はFALSEが返る。
boolean ctype_lower(string text) 引数の文字列が小文字かどうかを確認する。 引数 text 調べる文字列 戻り値 引数の全ての文字が小文字の場合はTRUE、それ以外の場合はFALSEを返す。
<?php
function dispKekka($str)
{
$kekka1 = ctype_upper($str);
$kekka2 = ctype_lower($str);
print('調べる文字列は'.$str.'です<br>');
if($kekka1 == TRUE)
{
print('文字列は大文字だけです<br><br>');
}
else
{
if($kekka2 == TRUE)
{
print('文字列は小文字だけです<br><br>');
}
else
{
print('文字列は大文字小文字が混合しています<br><br>');
}
}
}
$str = 'abc';
dispKekka($str);
$str = 'ABC';
dispKekka($str);
$str = 'abc89';
dispKekka($str);
$str = 'ABC89';
dispKekka($str);
?>