PHPのエラー「Warning: preg_match(): Compilation failed~」の解消方法

PHPを使っていて、「Warning: preg_match(): Compilation failed: nothing to repeat at offset~」というエラーが出ることがあります。このエラーを解決する方法をご紹介します。

Warning: preg_match(): Compilation failed: nothing to repeat at offset~のエラーについて

初めてこのエラーが出て解決方法がわからなかったので調べてみたんですが、なんとも簡単な理由で

基本がわかっていればこんなエラーは出ないっていうオチでした…

今回エラーが出た処理が以下のものです。

if(preg_match('/?123/',$_SERVER["REQUEST_URI"])){
	echo 'ここに処理を書く';
}

「preg_match」で現在のURLが指定の文字列(クエリ)に一致した時に処理を実行するというものでした。

この時点でなぜエラーが出たかわかる方は、この記事を見る必要はありません(笑)

エラーの原因

まずはエラー文を読んでみましょう。PHPのエラーは読んでみると意外にわかるんですよねー

最後の★はエラーの出ている行数です。

Warning: preg_match(): Compilation failed: nothing to repeat at offset 0 in /home/○○○○/public_html/index.php on line ★

「~offset」までの位置をGoogle翻訳に入れてみると…

警告:preg_match():コンパイルに失敗しました:オフセットで何も繰り返されません

とあります。残念ながらGoogle翻訳では今回は分かりませんでした…

で、結局のところこのエラーの原因は「正規表現部分」にあるということがわかりました。

エラーの解決方法

さっそくエラーの解決方法ですが…

if(preg_match('/?123/',$_SERVER["REQUEST_URI"])){
	echo 'ここに処理を書く';
}

このコードの「preg_match(‘/?123/’,」の部分が実は間違えているんです!

正規表現を囲う部分のデリミタ、スラッシュの部分をそう呼ぶのですが、このスラッシュ内に正規表現で扱う文字がある場合はエスケープしなければいけません。

ここで言うエスケープとは、正規表現用の文字列を通常の文字列として使うことです。

正規表現用の文字をエスケープする

if(preg_match('/\?123/',$_SERVER["REQUEST_URI"])){
	echo 'ここに処理を書く';
}

「?」の前にバックスラッシュ(\マーク)を置くだけです。Windowsだと「半角の¥マーク」です。これで「?」が正規表現用の文字としてでなく、通常の文字列として使われます。

 

たったこれだけのことでしたね…

基本からしっかり学んで入ればこんなことにはならないんでしょうけどね(笑)今回、これで勉強になった、ということで!

ちなみに公式サイトはこのように書かれていますので、一度読んでおくと勉強になります。

コメントはこちらから

コメントは承認後に表示されます

未入力は匿名になります