LoginSignup
13
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-07-17

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

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

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"
13
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
2