web-dev-qa-db-fra.com

Plage hors d'usage dans la classe de personnage

Je reçois cette erreur étrange dans la fonction preg_match ():

Attention: preg_match (): échec de la compilation: plage hors d'usage dans la classe de caractères au décalage 54

La ligne qui cause ceci est:

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

Ce que cette expression régulière fait, c'est analyser un fichier HTML, en extrayant uniquement la partie entre:

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

et:

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

Avez-vous une idée de ce qui pourrait causer cette erreur?

19
Dario

Si $gsmNumber contient un crochet, une barre oblique inverse ou divers autres caractères spéciaux, cette erreur peut être déclenchée. Si cela est possible, vous voudrez peut-être le valider pour vous assurer qu'il s'agit bien d'un nombre avant ce point.

Éditer 2016:

Il existe une fonction PHP qui peut échapper des caractères spéciaux dans les expressions régulières: preg_quote() .

Utilisez-le comme ceci:

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);

Évidemment, dans ce cas, comme vous avez utilisé deux fois la même chaîne, vous pouvez d'abord affecter la version citée à une variable et la réutiliser.

6
thomasrutter

Bonjour, j'ai eu la même erreur et l'ai résolue:

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

Phase de recherche:

.. Plage en panne .. Il y a donc une plage définie qui ne peut pas être utilisée.

.. at offset N .. J'ai jeté un coup d'œil à mon motif de regex. La position N était le "-". Il est utilisé pour définir des plages telles que "a-z" ou "0-9" etc.

Solution

J'ai simplement échappé au "-".

 \-    

Maintenant, il est interprété comme le caractère "-" et non comme une plage!

65
krang

Cette erreur est due à une plage incorrecte. Par exemple: 9-0 aZ Pour corriger cela, vous devez changer 9-0 en 0-9 et aZ en a-zA-Z. Dans votre cas, vous n'échappez pas au caractère "-", puis preg_match essaiera regex et échouer avec une plage incorrecte. Échappez au "-" et cela doit résoudre votre problème.

9
Estefano Salazar

Bien que les autres réponses soient correctes, je suis surpris de voir que personne n'a suggéré d'échapper à la variable avec preg_quote() avant de l'utiliser dans une expression régulière. Donc, si vous cherchez à faire correspondre un crochet réel ou toute autre chose qui signifie quelque chose dans regex, cela sera converti en un jeton littéral:

$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
Dencker

Je recevais cette erreur avec la séquence suivante:

[/-.]

Déplacer simplement le . au début a résolu le problème:

[./-]
3
N Rohler

Ceci est un bogue dans plusieurs versions de PHP, comme je viens de le vérifier pour la version 5.3.5 actuelle, emballé avec XAMPP 1.7.4 sur Windows XP édition familiale.

Même certains exemples très simples présentent le problème, par exemple,

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

Les personnes PHP connaissent le bogue depuis le 10.10.2010. Voir http://pear.php.net/bugs/bug.php?id=18182 . Le bogue est marqué "fermé" mais persiste.

0
Page Notes

Vous avez probablement des personnes qui insèrent des numéros de téléphone mobile comprenant des caractères +, -, (et/ou) et les utilisez telles quelles dans votre preg_match, de sorte que vous souhaitiez peut-être effacer les données fournies avant de les utiliser (c'est-à-dire en supprimant complètement ces caractères) .

0
wimvds