web-dev-qa-db-fra.com

Le délimiteur ne doit pas être alphanumérique ni antislash 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 quand im exécuté, il renvoie cette erreur:

Attention: preg_match () [function.preg-match]: le délimiteur ne doit pas être alphanumérique ni antislash

66
user547363

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

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

La solution (que les autres réponses ne mentionnent pas - du moins au moment où j'écris ceci à l'origine) est que lorsque PHP fait référence à des délimiteurs, il ne s'agit pas des délimiteurs que vous voyez dans votre code (qui sont des guillemets) mais les caractères suivants à l'intérieur de la chaîne (en fait, je n'ai jamais vu cela énoncé nulle part dans aucune documentation: vous devez le voir dans des exemples.) Ainsi, au lieu d'avoir une syntaxe d'expression régulière semblable à celle que vous pouvez utiliser être habitué à de nombreuses autres langues:

/something/

PHP utilise des chaînes de caractères, puis cherche à l'intérieur de la chaîne , un autre délimiteur:

'/something/'

Le délimiteur PHP fait référence à est la paire de / caractères au lieu de la paire de ' personnages. Donc, si vous écrivez 'something', PHP prendra s comme délimiteur prévu et se plaindre de ne pas être autorisé à utiliser des caractères alphanumériques comme délimiteur.

Donc, 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 en dehors des délimiteurs de regex:

'/something/i'

Si vous voulez utiliser autre chose que / en tant que délimiteur, vous pouvez le faire, par exemple si vous faites correspondre une URL et que vous ne voulez pas avoir à échapper à tous les slash:

'~something~'
57
iconoclast

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 est l'expression. Cela vous permet d'utiliser des modificateurs et l'interpréteur pour savoir quelle expression est une expression et lesquels sont des modificateurs. Comme l'indique le message d'erreur, le délimiteur ne peut pas être une barre oblique inversée, car celle-ci est le caractère d'échappement.

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

et au-dessous du même exemple, mais avec le modificateur i à faire correspondre sans être sensible à la casse.

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

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

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

20
Ben Swinburne

Le motif doit avoir des délimiteurs. Les délimiteurs peuvent être des barres obliques (/) ou des caractères non alphanumériques (#, $, *, ...). Exemples

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

S'il vous plaît essayer avec cela

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

Vous pouvez également utiliser bibliothèque T-Regx qui a délimiteurs automatiques pour vous:

$string1 = "My name is 'Kate' and im fine"; 

$matches = pattern("My name is '(.*)' and im fine")->match($string1)->all();

                 // ↑ No delimiters needed 
0
Danon