Edited at

正規表現のデリミタは"/"じゃなくても良い


正規表現のデリミタについて

公式のマニュアルなんかを見ると、デリミタは毎回/なので、/を使うものだと思っていた。

preg_match('/(foo)(bar)(baz)/', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);

ただ、これは/hoge/でも{hoge}でもok

マニュアルをよく見ると,@を使っている例も載っていた

preg_match('@^(?:http://)?([^/]+)@i',

"http://www.php.net/index.html", $matches);
$host = $matches[1];


どんな時にデリミタを変えるのか?

URLに対して正規表現で処理をする機会があり、/を使っていたところ想定外の挙動になってしまったのがきっかけで、今回のことを調べた。

公式のマニュアルのように、urlに対して正規表現によるマッチングを行う場合は、urlに/が入っているため、デリミタを/以外のものを使用した方が良い。個人的には@よりも {}の方が好きですね。

先ほどのurlの例をデリミタ/を使用して見ます。

バージョンは7.2です。

$ php -v

PHP 7.2.14 (cli) (built: Jan 12 2019 05:21:04) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.14, Copyright (c) 1999-2018, by Zend Technologies

動いたけどwarningが出てました。

$ php -a

Interactive shell

php > preg_match('@^(?:http://)?([^/]+)@i',
php ( "http://www.php.net/index.html", $matches);
php > var_dump($matches[1]);
string(11) "www.php.net"
php > preg_match('/^(?:http://)?([^/]+)/i',
php ( "http://www.php.net/index.html", $matches);
PHP Warning: preg_match(): Unknown modifier '/' in php shell code on line 2

Warning: preg_match(): Unknown modifier '/' in php shell code on line 2
php > var_dump($matches[1]);
string(11) "www.php.net"