「PHPの基礎 - 文字列」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
161行目: 161行目:
<br><br>
<br><br>


== 変数展開 ==
== 全角・半角 ==
文字列をダブルクオーテーションで囲む場合やヒアドキュメントの場合、文字列に変数が存在する時、変数は格納されている値に置換される。<br>
全角・半角が混ざった文字列を正確にカウントする場合、いくつかの方法が存在する。<br>
このような処理を変数展開と呼ぶ。<br>
必ず、エンコーディング (UTF-8等) を指定する必要があることに注意する。<br>
<br>
<br>
以下の例では、文字列に変数nameが記述されている。<br>
また、全角・半角を区別してカウントする場合は、正規表現を使用することができる。<br>
この文字列を出力する時、"こんにちは。高橋 さん"と変数に格納されている値に置き換えて出力される。<br>
<br>
==== mb_strlen関数の使用 ====
これは、簡便で高速な方法である。<br>
  <syntaxhighlight lang="php">
  <syntaxhighlight lang="php">
  $name = '高橋';
  $str = "1 あ イ";
  echo "こんにちは。$name さん";
$count1 = mb_strlen($str, 'UTF-8');
  echo "mb_strlen(): " . $count1 . "\n"; // 結果: 5
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
変数展開において、変数が記述された位置の後ろにアルファベットが続く場合は、どこまでが変数名なのか区別できない場合がある。<br>
==== preg_match_all関数を使用して文字単位でカウント ====
以下の例では、変数colornamecolorを変数展開されてしまう。<br>
より複雑なパターンマッチングが必要な場合に使用する。<br>
  <syntaxhighlight lang="php">
  <syntaxhighlight lang="php">
  $colorname = 'red';
  $str = "1 あ イ";
  echo "frame is $colornamecolor";
$count2 = preg_match_all('/./u', $str, $matches);
  echo "preg_match_all(): " . $count2 . "\n"; // 結果: 5
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
このように、どこまでが変数名なのか区別できない場合や配列変数等を使用する場合は、変数名を<code>{}</code>で囲んで記述する。<br>
==== 配列に分解してカウント ====
  <syntaxhighlight lang="php">
  <syntaxhighlight lang="php">
  $colorname = 'red';
  $str = "1 あ イ";
  echo "frame is ${colorname}color";
$array = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
$count3 = count($array);
  echo "preg_split(): " . $count3 . "\n"; // 結果: 5
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
<u>※注意</u><br>
==== mb_str_split関数の使用 (PHP 7.4以降) ====
<u>シングルクオーテーションで囲んだ文字列で変数を記述しても、変数展開は行われない。</u><br>
文字列を配列に分解できるため、文字ごとの処理が必要な場合に便利である。<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)

文字列を出力するには、echoprintが存在する。

echoの書式は、以下の通りである。

echo ""
void echo(string $arg1 [, string $... ])


echoは引数に指定した文字列を出力する。
複数の文字列を続けて出力する場合、カンマ,で区切って文字列を指定する。

 echo 'こんにちは';
 echo '出身地:', '東京都';


厳密にいうと、echoは関数ではなくPHPの言語構造の1つである。
そのため、引数を括弧で括る必要はなく、関数のように括弧で括って記述することもできる。
ただし、複数の文字列を引数に指定する場合、括弧で括らない方がよい。

 echo('こんにちは');


printの書式は、以下の通りである。

print ""
int print(string $arg)


printは、引数に指定した文字列を出力する。echoとは異なり、複数の引数を指定できない。
また、戻り値として常に1を返す。

 print 'こんにちは';


printechoと同様、関数ではなく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);
 ?>