PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPの正規表現で[\S\s]*はどういう意味?改行を含むすべての文字にマッチさせる方法を解説

PHPの正規表現における [\S\s]* は、「改行を含むすべての文字(任意の1文字)に0回以上マッチする」という意味のパターンです。一見すると分かりにくい書き方ですが、複数行テキストを扱う際によく使われる重要なテクニックです。

\s と \S の基本的な意味

[\S\s] を理解するために、まずそれぞれの要素を確認しましょう。

  • \s … 空白文字(半角スペース、タブ、改行 \n など)にマッチ
  • \S … 空白以外のすべての文字にマッチ
  • [ ](文字クラス)… 内側のいずれか1文字にマッチ

つまり [\S\s] は「空白文字または空白以外の文字」=あらゆる1文字にマッチし、末尾の * によって「0回以上の繰り返し」を意味します。結果として、改行を含む文字列全体をひとつのパターンで表現できます。

なぜ「.(ドット)」ではなく [\S\s] を使うのか

正規表現の .(ドット)も「任意の1文字」にマッチしますが、デフォルトでは改行文字にはマッチしません。そのため、複数行にまたがる文字列を一括でマッチさせたい場合には、ドットだけでは不十分です。

この問題を解決する方法は主に2つあります。

  • パターンに [\S\s]* を使う(改行にもそのままマッチする)
  • パターン修飾子 /s(PCRE_DOTALL)を付けて、ドットが改行にもマッチするようにする

サンプルコード

<?php
$str = "hello \n world";

// パターン1: ドットのみ(改行をまたげない)
echo preg_match('/^.*$/', $str);

// パターン2: [\S\s]* を使用(改行を含めてマッチ)
echo preg_match('/^[\S\s]*$/', $str);

// パターン3: /s 修飾子を使用(ドットが改行にもマッチ)
echo preg_match('/^.*$/s', $str);

実行結果

0
1
1

結果の解説

preg_match() 関数は、正規表現パターンが対象の文字列にマッチした場合に 1、マッチしなかった場合に 0 を返します。

パターン1では、. が改行 \n を越えられないため、^(先頭)から $(末尾)までのマッチが完了せず、結果は 0 になります。一方、パターン2・3は改行を含む文字列全体にマッチできるため、1 が返ります。

まとめ

  • [\S\s]* = 改行を含む任意の文字の0回以上の繰り返し
  • ドットはデフォルトで改行にマッチしないため、複数行マッチには [\S\s]*/s 修飾子を使う
  • preg_match() はマッチすれば 1、しなければ 0 を返す
  1. LinuxにおけるBashとは?意味・仕組み・使い方を徹底解説

    Linuxを使っているなら、フォーラムや記事で「Bash」という言葉を目にしたことがあるでしょう。ターミナルの同義語のように使われることもありますが、Bashとターミナルエミュレータはまったく別のアプリケーションです。では、Bashとは一体何なのでしょうか?この記事では、Bashの正体、その役割、そして実際に使い始める方法までをわかりやすく解説します。 Bashとは何か Bashという名前は「Bourne-Again SHell」の頭文字から来ています。これは、Bashの前身の一つを作ったStephen Bourne(スティーブン・ボーン)の名前をもじった言葉遊びです。最初のベータ版は1989

  2. アプリ内課金とは?意味から仕組み、メリット・デメリットまで徹底解説

    モバイルアプリを日常的に使っている方なら、「アプリ内課金」という言葉に触れたことがあるはずです。ただし、その正確な意味や仕組みについては、曖昧に感じている人も少なくないでしょう。 アプリ内課金について理解することは重要です。実際に利用する際だけでなく、プライバシー、セキュリティ、法規制など、常に変化し続ける関連議論に参加するためにも必要な知識だからです。 「アプリ内課金」とは何を意味するのか? Investopediaでは、アプリ内課金を「モバイルデバイス上のアプリケーション内部から商品やサービスを購入すること」と定義しています。これは出発点として良い定義ですが、情報源や文脈によって、より細か