hnwの日記

PHPのPCRE関数での\Q,\EはPerlと同一ではない

Perl正規表現で利用できる便利なエスケープシーケンスとして、\Qと\Eがあります。これはメタ文字の解釈を止めたり、その解釈を再開したりするものです。「man perlre」には次のような例が出てきます。

/$unquoted\Q$quoted\E$unquoted/


この正規表現は変数$unquotedと$quotedの値を利用しますが、利用のされかたが異なります。$unquotedの値はそのまま正規表現として解釈されますが、$quotedの値は文字列一致となります。

#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my $quoted = '.?';
my $unquoted = '.';
my $subject = "a.?a";
print $subject =~ /^$unquoted\Q$quoted\E$unquoted$/; # 1


また、\Qや\Eの解釈は変数展開と別のタイミングで行われるので、$quotedの値に\Eを入れてもメタ文字の解釈が停止したりはしません。単に「\E」の2バイトにマッチするだけです。


文字列の一部をユーザーの入力値そのものとマッチさせたい場合など、Perl正規表現では重宝する書き方です。

PCRE関数での\Qと\E

一方、PHPにもPCRE(Perl互換正規表現ライブラリ)を利用する関数群があり、\Qや\Eを利用することができます。実際、次のような場合はPerlと同じように動作します。

続きを読む