1. ホーム
  2. php

[解決済み] キャラクタークラスでレンジの順番が狂っている

2022-02-09 05:16:41

質問

preg_match()関数でこんな変なエラーが出るんだけど。

警告: preg_match(): Compilation failed: range out of order in character class at offset 54

原因となっている行は

preg_match("/<!--GSM\sPER\sNUMBER\s-\s$gsmNumber\s-\sSTART-->(.*)<!--GSM\sPER\sNUMBER\s-\s$gsmNumber\s-\sEND-->/s", $fileData, $matches);

この正規表現は、HTMLファイルをパースして、間の部分のみを抽出します。

<!--GSM PER NUMBER - 5550101 - START-->

とします。

<!--GSM PER NUMBER - 5550101 - END-->

このエラーの原因について、何かヒントをお持ちですか?

解決方法を教えてください。

もし $gsmNumber が角括弧、バックスラッシュ、その他様々な特殊文字を含んでいる場合、このエラーが発生する可能性があります。 もしそれが可能なら、この時点までに実際に数字であることを確認するために、それを検証しておくとよいでしょう。

2016年を編集しています。

正規表現内の特殊文字をエスケープするPHP関数が存在します。 preg_quote() .

このように使います。

preg_match(
  '/<!--GSM\sPER\sNUMBER\s-\s' .
  preg_quote($gsmNumber, '/') . '\s-\sSTART-->(.*)<!--GSM\sPER\sNUMBER\s-\s' .
  preg_quote($gsmNumber, '/') . '\s-\sEND-->/s', $fileData, $matches);

明らかにこの場合、同じ文字列を2回使っているので、最初に引用したバージョンを変数に代入して、それを再利用することができます。