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

ナビゲーションに移動 検索に移動
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>


案内メニュー