|
preg_match
正規表現によるマッチングを行う
説明
intfalse preg_match( string $pattern , string $subject , array &$matches = null , int $flags = 0, int $offset = 0 )
パラメータ
-
pattern
-
検索するパターンを表す文字列。
-
subject
-
入力文字列。
-
matches
-
matches を指定した場合、検索結果が代入されます。
$matches[0] にはパターン全体にマッチしたテキストが代入され、
$matches[1] には 1 番目のキャプチャ用サブパターンにマッチした
文字列が代入され、といったようになります。
-
flags
-
flags には以下のフラグの組み合わせを指定できます。
-
PREG_OFFSET_CAPTURE
-
このフラグを設定した場合、各マッチに対応する文字列のオフセットも(バイト単位で)返されます。
これは、matches の値を配列に変更することに注意してください。
その配列のすべての要素は、
オフセット 0 で一致した文字列、
およびその文字列のオフセット 1 での
subject へのオフセットからなります。
-
PREG_UNMATCHED_AS_NULL
-
このフラグが渡されると、マッチしなかったサブパターンは null として通知されます。
渡されなかった場合、空の string として通知されます。
-
offset
-
通常、検索は対象文字列の先頭から開始されます。
オプションのパラメータ offset を使用して
検索の開始位置を (バイト単位で) 指定することも可能です。
注意:
offset を用いるのと、
substr($subject, $offset) を
preg_matchの対象文字列として指定するのとは
等価ではありません。
これは、pattern には、
^, $ や
(?<=x) のような言明を含めることができるためです。
以下を比べてみてください。
戻り値
preg_match は、pattern
が指定した subject にマッチした場合に 1 を返します。
マッチしなかった場合は 0 を返します。
失敗した場合に false を返します
警告この関数は論理値
false を返す可能性がありますが、false として評価される値を返す可能性もあります。
詳細については 論理値の
セクションを参照してください。この関数の返り値を調べるには
===演算子 を
使用してください。
エラー / 例外
渡された正規表現のパターンがコンパイルできない場合、E_WARNING が発生します。
例
例1 文字列 "php" を探す
<?php
// パターンのデリミタの後の "i" は、大小文字を区別しない検索を示す
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
?>
例2 単語 "web" を探す
<?php
/* パターン内の \b は単語の境界を示す。このため、独立した単語の
* "web"にのみマッチし、"webbing" や "cobweb" のような単語の一部にはマッチしない */
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
?>
例3 URL からドメイン名を得る
<?php
// get host name from URL
preg_match('@^(?:http://)?([^/]+)@i',
"http://www.php.net/index.html", $matches);
$host = $matches[1];
// get last two segments of host name
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo "domain name is: {$matches[0]}\n";
?>
例4 名前つきサブパターンの使用法
<?php
$str = 'foobar: 2008';
preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);
/* 別のやり方 */
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);
print_r($matches);
?>
Array
(
[0] => foobar: 2008
[name] => foobar
[1] => foobar
[digit] => 2008
[2] => 2008
)
注意
ヒント
ある文字列が他の文字列内に含まれているかどうかを調べるためだけに
preg_match を使うのは避けた方が良いでしょう。
strpos 関数を使うほうが速くなります。
参考
- PCRE のパターン
- preg_quote
- preg_match_all
- preg_replace
- preg_split
- preg_last_error
- preg_last_error_msg
|