108 votes

Le délimiteur ne doit pas être alphanumérique ou une barre oblique inverse et preg_match

J'ai ce code :

$string1 = "My name is 'Kate' and im fine"; 
$pattern = "My name is '(.*)' and im fine"; 
preg_match($pattern , $string1, $matches);
echo $matches[1];

et lorsque je l'exécute, il renvoie cette erreur :

Attention : preg_match() [function.preg-match] : Le délimiteur ne doit pas être alphanumérique ou un backslash.

3 votes

Une remarque qui pourrait être utile à d'autres, si vous passez tous vos arguments à preg_match() en tant que variables, veillez à ne pas mélanger accidentellement l'ordre des variables dans l'appel de la fonction, car cela entraînera très certainement l'apparition de cette même erreur.

1 votes

Vous avez besoin d'un délimiteur dans votre chaîne d'expressions rationnelles

2 votes

Utilisation $pattern = "/My name is '(.*)' and im fine/";

156voto

Paul Points 2497

Vous avez besoin d'un délimiteur pour votre modèle. Il doit être ajouté au début et à la fin du motif, comme suit :

$pattern = "/My name is '(.*)' and im fine/";  // With / as a delimeter

3 votes

Attention à ne pas utiliser de guillemets doubles pour encapsuler les expressions de type "regex", car certaines combinaisons de caractères (telles que \l pour saut de ligne) seront convertis en leur caractère, ce qui peut produire une expression différente de celle attendue. Utilisez des guillemets simples. Voir php Description des chaînes de caractères .

0 votes

Dans cet exemple, la chaîne comprend des guillemets simples, il est donc plus facile d'utiliser des guillemets doubles pour l'entourer (en évitant l'échappatoire \' qui serait nécessaire s'il était entre guillemets simples).

1 votes

Je faisais un commentaire général, car les personnes qui voient des exemples peuvent les considérer comme des choses à faire pour eux-mêmes, sans se rendre compte des conséquences imprévues qui peuvent se produire s'ils les étendent à d'autres situations. Malheureusement, je ne peux pas modifier mon commentaire pour qu'il soit encore plus spécifique.

84voto

iconoclast Points 3743

La solution (que les autres réponses ne mentionnent pas - du moins au moment où j'ai écrit ceci) est que lorsque PHP fait référence aux délimiteurs, il ne fait pas référence aux délimiteurs que vous voyez dans votre code (qui sont des guillemets) mais aux caractères suivants à l'intérieur de la chaîne de caractères. (En fait, je n'ai jamais vu cela dans aucune documentation : il faut le voir dans les exemples). Ainsi, au lieu d'avoir une syntaxe d'expression régulière comme celle à laquelle vous êtes habitué dans de nombreux autres langages :

/something/

PHP utilise des chaînes de caractères, puis recherche dans la chaîne de caractères les éléments suivants autre délimiteur :

'/something/'

Le délimiteur auquel PHP fait référence est la paire de caractères / au lieu de la paire de caractères ' caractères. Ainsi, si vous écrivez 'something' PHP prendra s comme délimiteur prévu et se plaindre qu'il n'est pas permis d'utiliser des caractères alphanumériques comme délimiteurs.

Ainsi, si vous voulez passer (par exemple) un i pour montrer que vous voulez une correspondance insensible à la casse, vous le passez à l'intérieur de la chaîne mais à l'extérieur des délimiteurs de la regex :

'/something/i'

Si vous souhaitez utiliser autre chose que / comme délimiteur, vous pouvez le faire, par exemple si vous faites correspondre une URL et que vous ne voulez pas avoir à échapper toutes les barres obliques :

'~something~'

24voto

Ben Swinburne Points 6771

Vous devez spécifier un délimiteur pour votre expression. Un délimiteur est un caractère spécial utilisé au début et à la fin de votre expression pour indiquer quelle partie constitue l'expression. Cela vous permet d'utiliser des modificateurs et de faire en sorte que l'interpréteur sache ce qui est une expression et ce qui est un modificateur. Comme l'indique le message d'erreur, le délimiteur ne peut pas être une barre oblique inverse, car celle-ci est le caractère d'échappement.

$pattern = "/My name is '(.*)' and im fine/";

et ci-dessous le même exemple mais avec le i pour qu'il corresponde sans tenir compte des majuscules et minuscules.

$pattern = "/My name is '(.*)' and im fine/i";

Comme vous pouvez le constater, le i se trouve en dehors des barres obliques et est donc interprété comme un modificateur.

N'oubliez pas non plus que si vous utilisez une barre oblique (/) comme délimiteur, vous devez échapper aux autres utilisations de / dans l'expression régulière, le cas échéant.

8voto

Nick Points 2689

Le motif doit comporter des délimiteurs. Les délimiteurs peuvent être une barre oblique (/) ou tout autre caractère non alphanumérique (#,$,*,...). Exemples d'application

$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#";
$pattern = "@My name is '(.*)' and im fine@";

1voto

Nubian Points 116

Peut-être pas en rapport avec l'exemple de code original, mais j'ai reçu l'erreur "Delimiter must not be alphanumeric or backslash" et j'ai cherché sur Google. Raison : j'ai mélangé l'ordre des paramètres pour preg_match. Le motif était le deuxième paramètre et la chaîne à faire correspondre était le premier. Attention :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X