Диапазон не по порядку в классе персонажей


Я получаю эту странную ошибку в функции 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-->

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

 18
Author: Dario, 2010-08-11

7 answers

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

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

 5
Author: thomasrutter, 2016-07-12 00:43:33

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

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

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

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

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

Решение

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

 \-    

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

 63
Author: krang, 2012-12-12 09:32:56

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

 9
Author: Estefano Salazar, 2014-04-25 18:01:53

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

[/-.]

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

[./-]
 3
Author: N Rohler, 2012-11-25 00:04:56

Хотя другие ответы верны, я с удивлением вижу, что никто не предложил экранировать переменную с помощью 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);
 3
Author: Dencker, 2015-03-26 15:35:39

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

 0
Author: wimvds, 2010-08-11 07:29:35

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

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

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

Разработчики PHP знают об ошибке с 1/10/2010. См. http://pear.php.net/bugs/bug.php?id=18182 . Ошибка помечена как "закрытая", но сохраняется.

 0
Author: Page Notes, 2011-06-30 18:00:36