Диапазон не в порядке в классе персонажа - PullRequest
21 голосов
/ 11 августа 2010

Я получаю эту странную ошибку в функции preg_match ():

Предупреждение: preg_match (): Ошибка компиляции: диапазон в порядке в классе символов со смещением 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-->

У вас есть подсказка о том, что может быть причиной этой ошибки?

Ответы [ 7 ]

68 голосов
/ 12 декабря 2012

Привет, я получил ту же ошибку и решил ее:

  Warning: preg_match(): Compilation failed: range out of order in character class at offset <N>

Этап исследования:

.. Диапазон не в порядке .. Таким образом, существует диапазонопределены, которые не могут быть использованы.

.. по смещению N .. Я быстро взглянул на свой шаблон регулярных выражений.Позиция N была "-".Он используется для определения диапазонов, таких как "az" или "0-9" и т. Д.

Решение

Я просто избежал "-".

 \-    

Теперьинтерпретируется как символ "-", а не как диапазон!

9 голосов
/ 25 апреля 2014

Эта ошибка вызвана неправильным диапазоном. Например: 9-0 a-Z Чтобы исправить это, вы должны изменить 9-0 на 0-9 и a-Z на a-zA-Z В вашем случае вы не экранируете символ "-", а затем preg_match попытается разобрать регулярное выражение и потерпеть неудачу с неверным диапазоном. Избегайте "-", и это должно решить вашу проблему.

7 голосов
/ 11 августа 2010

Если $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);

Очевидно, в этом случае, потому что вы использовали одну и ту же строку дваждыВы можете назначить указанную версию переменной и использовать ее повторно.

4 голосов
/ 25 ноября 2012

Я получаю эту ошибку в следующей последовательности:

[/-.]

Простое перемещение . в начало решило проблему:

[./-]
3 голосов
/ 26 марта 2015

Хотя остальные ответы верны, я удивлен, увидев, что никто не предлагал экранировать переменную с помощью preg_quote() перед ее использованием в регулярном выражении. Так что, если вы хотите сопоставить фактическую скобку или что-то еще, что означает что-то в регулярном выражении, это будет преобразовано в буквальный токен:

$escaped = preg_quote($gsmNumber);
preg_match( '/<!--GSM\sPER\sNUMBER\s-\s'.$escaped.'\s-\sSTART-->(.*)<!--GSM\sPER\sNUMBER\s-\s'.$escaped.'\s-\sEND-->/s', $fileData, $matches);
0 голосов
/ 30 июня 2011

Это ошибка в нескольких версиях PHP, как я только что проверил для текущей версии 5.3.5, которая поставляется вместе с XAMPP 1.7.4 в домашней версии Windows XP.

Даже некоторые очень простые примеры демонстрируют проблему, например,

    $pattern = '/^[\w_-. ]+$/';
    $uid = 'guest';
    if (preg_match($pattern, $uid)) echo 
      ("<style> p { text-decoration:line-through } </style>");

Пользователи PHP знают об ошибке с 10.01.2010. Смотри http://pear.php.net/bugs/bug.php?id=18182. Ошибка помечена как «закрытая», но сохраняется.

0 голосов
/ 11 августа 2010

У вас, вероятно, есть люди, которые вставляют номера мобильных телефонов, включая символы +, -, (и / или), и просто используете их как есть в вашем preg_match, так что вы можете санировать предоставленные данные перед их использованием (то есть путем удаления этих символов).полностью).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...