(同じ利用者による、間の6版が非表示)
158行目: 158行目:
  <syntaxhighlight lang="php">
  <syntaxhighlight lang="php">
  print '出身地は¥'大阪¥'です';
  print '出身地は¥'大阪¥'です';
</syntaxhighlight>
<br><br>
== 文字列の抽出 ==
mb_substr関数は、日本語等のマルチバイト文字列を安全に扱うための関数である。<br>
<br>
mb_substrの主な使用パターンを以下に示す。<br>
* 基本的な文字列の切り出し
* 末尾からの文字列取得
* 途中からの文字列取得
* エンコーディングを指定した使用方法
<br>
<u>※注意</u><br>
* 必要に応じて適切な文字エンコーディングを指定する。
* 文字列の長さを確認する場合は、mb_strlen関数を使用する。
* 負の位置指定も可能だが、慎重に使用する。
<br>
==== 抽出の基本 ====
<syntaxhighlight lang="php">
$text = "こんにちは世界";
$substr = mb_substr($text, 0, 3); // "こんに" が取得される
echo $substr . "\n";
</syntaxhighlight>
<br>
==== 負の開始位置を使用 (末尾から数える) ====
<syntaxhighlight lang="php">
$text = "プログラミング";
$substr = mb_substr($text, -3);  // "ミング"が取得される
echo $substr . "\n";
</syntaxhighlight>
<br>
==== 文字列の途中から指定文字数を取得 ====
<syntaxhighlight lang="php">
$text = "私はPHPが好きです";
$substr = mb_substr($text, 2, 3); // "PHP" が取得される
echo $substr . "\n";
</syntaxhighlight>
<br>
==== 文字エンコーディングの指定 ====
<syntaxhighlight lang="php">
$text = "안녕하세요";  // 韓国語
$substr = mb_substr($text, 0, 2, 'UTF-8');  // "안녕"が取得される
echo $substr . "\n";
</syntaxhighlight>
<br>
==== 長い文字列を省略して表示 (例: ブログの要約等) ====
<syntaxhighlight lang="php">
function createExcerpt(&$text, $length = 100)
{
    if (mb_strlen($text) > $length) {
      return mb_substr($text, 0, $length) . '...';
    }
    return $text;
}
$longText = "これは非常に長い文章である。途中で切られて...という形で表示される。";
echo createExcerpt($longText, 10);  // "これは非常に長..." が表示される
</syntaxhighlight>
<br><br>
== 文字列の検索 ==
mb_strpos関数は、マルチバイト文字列の中から特定の文字列が最初に現れる位置を検索する関数である。<br>
日本語等のマルチバイト文字を含む文字列で特に重要である。<br>
<br>
# 戻り値
文字列が見つかった場合 : 最初に現れる位置 (0から始まる)
見つからない場合 : false
<br>
# 引数
第1引数 : 検索対象の文字列
第2引数 : 検索する文字列
第3引数 : 検索開始位置 (オプション)
第4引数 : 文字エンコーディング (オプション)
<br>
使用するシーンを以下に示す。<br>
* 文字列の存在の確認
* 特定の文字列間のテキスト抽出
* タグやマーカーの位置検出
* 文字列の分割処理
<br>
<u>※注意</u><br>
* 戻り値のチェックには必ず<code>===</code>を使用する。(0とfalseを区別するため)
* 必要に応じて適切な文字エンコーディングを指定する。
* 大文字・小文字を区別するため、必要に応じてカスタム関数を作成する。
<br>
==== 基本的な使用例 ====
<syntaxhighlight lang="php">
$text    = "こんにちは世界";
$position = mb_strpos($text, "世界");  // 5が返される
echo "Position: " . $position . "\n";
</syntaxhighlight>
<br>
==== 検索開始位置の指定 ====
<syntaxhighlight lang="php">
$text    = "PHPはとても楽しい。PHPで開発しましょう。";
$position = mb_strpos($text, "PHP", 5);  // 12が返される (2番目のPHPの位置)
echo "Second PHP position: " . $position . "\n";
</syntaxhighlight>
<br>
==== 文字が見つからない場合の処理 ====
<syntaxhighlight lang="php">
$text    = "こんにちは世界";
$position = mb_strpos($text, "さようなら");
if ($position === false) {
    echo "文字列が見つかりませんでした。\n";
}
</syntaxhighlight>
<br>
==== 文字エンコーディングの指定 ====
<syntaxhighlight lang="php">
$text    = "안녕하세요";  // 韓国語
$position = mb_strpos($text, "하", 0, 'UTF-8');
echo "Korean character position: " . $position . "\n";
</syntaxhighlight>
<br>
==== 実践的な使用例 : 文字列の存在の確認と部分取得 ====
<syntaxhighlight lang="php">
function extractText($text, $start_marker, $end_marker)
{
    $start_pos = mb_strpos($text, $start_marker);
    if ($start_pos === false) {
      return null;
    }
    $start_pos += mb_strlen($start_marker);
    $end_pos    = mb_strpos($text, $end_marker, $start_pos);
    if ($end_pos === false) {
      return null;
    }
    return mb_substr($text, $start_pos, $end_pos - $start_pos);
}
$text    = "【タイトル】PHPプログラミング【終了】";
$content = extractText($text, "【タイトル】", "【終了】");
echo "Extracted content: " . $content . "\n"; // "PHPプログラミング" が出力される
</syntaxhighlight>
<br>
==== 大文字・小文字を区別しない検索 ====
<syntaxhighlight lang="php">
function mb_stripos_custom($haystack, $needle)
{
    return mb_strpos(
      mb_strtolower($haystack),
      mb_strtolower($needle)
    );
}
$text    = "PHPとphpは同じ意味です。";
$position = mb_stripos_custom($text, "php");
echo "Case-insensitive position: " . $position . "\n";
</syntaxhighlight>
<br><br>
== 文字列の置換 ==
str_replace関数は文字列の置換を行う関数である。<br>
<br>
str_replace($search, $replace, $subject [, &$count])
# 第1引数 : 検索する文字列または配列
# 第2引数 : 置換する文字列または配列
# 第3引数 : 対象の文字列または配列
# 第4引数 : 置換が行われた回数 (オプション)
<br>
str_replace関数の特徴を以下に示す。<br>
* 大文字・小文字を区別する。<br>区別しない場合は、str_ireplace関数を使用する。
* 配列での複数置換が可能である。
* 文字列だけでなく配列も処理可能である。
* マルチバイト文字 (日本語等) も処理できる。
<br>
<u>注意</u><br>
* 配列を使用する場合、search配列とreplace配列の要素数が異なる場合は空文字が使用される。
* パフォーマンスを考慮する場合は、正規表現 (preg_replace関数) の使用も検討する。
* 大量のデータを処理する場合はメモリ使用量に注意する。
<br>
一般的な使用シーンを以下に示す。<br>
* テキストの整形
* HTMLの処理
* ファイル名の処理
* データのクリーニング
* フォーマット変換
<br>
==== 置換の基本 ====
<syntaxhighlight lang="php">
$text = "Hello World";
$result = str_replace("World", "PHP", $text);
echo $result . "\n"; // "Hello PHP"
</syntaxhighlight>
<br>
==== 日本語 (マルチバイト文字) の置換 ====
<syntaxhighlight lang="php">
$text = "こんにちは世界";
$result = str_replace("世界", "みなさん", $text);
echo $result . "\n"; // "こんにちはみなさん"
</syntaxhighlight>
<br>
==== 複数の文字列を置換 ====
<syntaxhighlight lang="php">
$text = "りんごとバナナとみかん";
$search = ["りんご", "バナナ", "みかん"];
$replace = ["🍎", "🍌", "🍊"];
$result = str_replace($search, $replace, $text);
echo $result . "\n";  // "🍎と🍌と🍊"
</syntaxhighlight>
<br>
==== 置換回数のカウント ====
<syntaxhighlight lang="php">
$text = "The cat and the cat and the cat";
$count = 0;
$result = str_replace("cat", "dog", $text, $count);
echo $result . "\n";              // "The dog and the dog and the dog"
echo "置換回数: " . $count . "\n";  // "置換回数: 3"
</syntaxhighlight>
<br>
==== 大文字・小文字を区別しない置換 (str_ireplaceの使用) ====
<syntaxhighlight lang="php">
$text = "Hello HELLO hello";
$result = str_ireplace("hello", "hi", $text);
echo $result . "\n"; // "hi hi hi"
</syntaxhighlight>
<br>
==== 配列内の要素の置換 ====
<syntaxhighlight lang="php">
$fruits = ["apple", "banana", "apple", "orange"];
$result = str_replace("apple", "grape", $fruits);
print_r($result); // ["grape", "banana", "grape", "orange"]
</syntaxhighlight>
<br>
==== その他の使用例 ====
<syntaxhighlight lang="php">
// 使用例 1 : HTMLタグのエスケープ
function escapeHTML($text)
{
    $search = ['<', '>', '"', "'", '&'];
    $replace = ['&lt;', '&gt;', '&quot;', '&#39;', '&amp;'];
    return str_replace($search, $replace, $text);
}
$html = "<p>This is a 'test' & example</p>";
echo escapeHTML($html) . "\n";
// 使用例 2 : ファイル拡張子の変更
function changeFileExtension($filename, $newExt)
{
    $info = pathinfo($filename);
    return str_replace($info['extension'], $newExt, $filename);
}
$filename = "document.txt";
echo changeFileExtension($filename, "pdf") . "\n";  // "document.pdf"
// 使用例 3 : 電話番号のフォーマット
function formatPhoneNumber($phone)
{
    $phone = str_replace(['-', ' ', '(', ')'], '', $phone);
    return substr($phone, 0, 3) . '-' .
          substr($phone, 3, 4) . '-' .
          substr($phone, 7);
}
echo formatPhoneNumber("09012345678") . "\n";  // "090-1234-5678"
// 使用例 4 : 文字列のクリーニング
function cleanString($string)
{
    $unwanted = ["\r", "\n", "\t", "  "];
    $wanted = ["", " ", " ", " "];
    return trim(str_replace($unwanted, $wanted, $string));
}
$dirty = "This is a\n\t messy  string";
echo cleanString($dirty) . "\n";
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>
181行目: 460行目:
  $str = "1 あ イ";
  $str = "1 あ イ";
   
   
// preg_match_all関数の第3引数は、参照渡しのパラメータで、以下に示すような特徴がある。
// 関数の実行結果がこの変数に格納される
// 変数を事前に初期化する必要はない
// 関数内で自動的に配列として作成される
  $count2 = preg_match_all('/./u', $str, $matches);
  $count2 = preg_match_all('/./u', $str, $matches);
  echo "preg_match_all(): " . $count2 . "\n";  // 結果: 5
  echo "preg_match_all(): " . $count2 . "\n";  // 結果: 5
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== 配列に分解してカウント ====
==== 配列に分解してカウント ====
  <syntaxhighlight lang="php">
  <syntaxhighlight lang="php">
403行目: 687行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>
== 文字参照 (HTMLエンティティ) へ変換 ==
<code>htmlspecialchars</code>関数は、特殊文字 (<code><</code>や<code>></code>等) を文字参照 (HTMLエンティティ) に変換する。<br>
<br>
<syntaxhighlight lang="php">
htmlspecicalchars("$_POST["変数名"]", ENT_QUOTES);
</syntaxhighlight>
<br><br>


{{#seo:
{{#seo: