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 je suis exécuté, il renvoie cette erreur:
Attention: preg_match () [function.preg-match]: Le délimiteur ne doit pas être alphanumérique ou antislash
php
regex
preg-match
user547363
la source
la source
preg_match()
tant que variables, assurez-vous de ne pas mélanger accidentellement l'ordre des variables dans l'appel de fonction, car cela entraînera presque certainement le même résultat erreur apparaissant.$pattern = "/My name is '(.*)' and im fine/";
Réponses:
Vous avez besoin d'un délimiteur pour votre motif. Il doit être ajouté au début et à la fin du motif comme ceci:
$pattern = "/My name is '(.*)' and im fine/"; // With / as a delimeter
la source
\l
pour le saut de ligne) seront converties en leur caractère, ce qui pourrait bien produire une expression différente de celle attendue. Utilisez des guillemets simples. Voir la description des chaînes php .\'
qui seraient nécessaires si elle était entourée de guillemets simples).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 à des délimiteurs, il ne fait pas référence aux délimiteurs que vous voyez dans votre code (qui sont des guillemets) mais au suivant caractères à l'intérieur de la chaîne. (En fait, je n'ai jamais vu cela déclaré nulle part dans aucune documentation: vous devez le voir dans des exemples.) Donc, au lieu d'avoir une syntaxe d'expression régulière comme celle à laquelle vous êtes habitué dans de nombreux autres langages:
PHP utilise des chaînes, puis cherche dans la chaîne un 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. Donc, si vous écrivez'something'
, PHP prendras
comme délimiteur prévu et se plaindra que vous n'êtes pas 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
/
votre délimiteur, vous pouvez, par exemple si vous correspondez à une URL et que vous ne voulez pas avoir à échapper toutes les barres obliques:'~something~'
la source
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 qui 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 inverse car la barre oblique inverse est le caractère d'échappement.
$pattern = "/My name is '(.*)' and im fine/";
et ci-dessous le même exemple mais avec le
i
modificateur pour correspondre sans être sensible à la casse.$pattern = "/My name is '(.*)' and im fine/i";
Comme vous pouvez le voir, le
i
est en dehors des barres obliques et est donc interprété comme un modificateur.Gardez également à l'esprit que si vous utilisez une barre oblique (/) comme délimiteur, vous devez alors échapper aux autres utilisations de / dans l'expression régulière, si elle est présente.
la source
Le modèle doit avoir des délimiteurs. Les délimiteurs peuvent être une barre oblique (/) 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@";
la source
Vous pouvez également utiliser la bibliothèque T-Regx qui a des délimiteurs automatiques pour vous:
$matches = pattern("My name is '(.*)' and im fine")->match($string1)->all(); // ↑ No delimiters needed
la source
Peut-être pas lié à l'exemple de code original, mais j'ai reçu l'erreur «Le délimiteur ne doit pas être alphanumérique ou antislash» et googlé ici. Raison: j'ai mélangé l'ordre des paramètres pour preg_match. Le modèle était le deuxième paramètre et la chaîne à correspondre était la première. Faites attention :)
la source
Veuillez essayer avec ceci
$pattern = "/My name is '\(.*\)' and im fine/";
la source