Das Trennzeichen darf nicht alphanumerisch oder Backslash und preg_match sein

85

Ich habe diesen Code:

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

und wenn ich laufe, gibt es diesen Fehler zurück:

Warnung: preg_match () [function.preg-match]: Das Trennzeichen darf nicht alphanumerisch oder mit einem Backslash versehen sein

user547363
quelle
2
Als Hinweis, der für andere hilfreich sein preg_match()kann, stellen Sie sicher, dass die Reihenfolge der Variablen nicht versehentlich im Funktionsaufruf verwechselt wird , wenn Sie alle Ihre Argumente als Variablen übergeben, da dies mit ziemlicher Sicherheit auch dazu führt Fehler erscheint.
Bluebinary
1
Sie benötigen ein Trennzeichen in Ihrem regulären Ausdruck
Ki Jéy
1
Verwenden Sie$pattern = "/My name is '(.*)' and im fine/";
gk.

Antworten:

132

Sie benötigen ein Trennzeichen für Ihr Muster. Es sollte am Anfang und Ende des Musters wie folgt hinzugefügt werden:

$pattern = "/My name is '(.*)' and im fine/";  // With / as a delimeter 
Paul
quelle
Achten Sie darauf, keine doppelten Anführungszeichen zu verwenden, um Regex-Ausdrücke einzuschließen. Andernfalls werden einige \ + -Zeichenkombinationen (z. B. \lfür Zeilenvorschub) in ihre Zeichen konvertiert, wodurch möglicherweise ein anderer Ausdruck als erwartet erzeugt wird. Verwenden Sie einfache Anführungszeichen. Siehe Beschreibung der PHP-Strings .
Patanjali
In diesem Beispiel enthält die Zeichenfolge einfache Anführungszeichen, sodass es einfacher ist, doppelte Anführungszeichen zu verwenden, um sie einzuschließen (um das Escapezeichen zu vermeiden \', das erforderlich wäre, wenn sie in einfache Anführungszeichen eingeschlossen wäre).
Paul
Ich machte einen allgemeinen Kommentar, da Leute, die Beispiele betrachten, sie möglicherweise als etwas ansehen, das sie selbst „ausstechen“ können, ohne die unvorhergesehenen Konsequenzen zu erkennen, die auftreten können, wenn sie sie auf andere Situationen ausweiten. Leider kann ich meinen Kommentar nicht noch genauer ändern.
Patanjali
68

Die Lösung (die in anderen Antworten nicht erwähnt wird - zumindest zum Zeitpunkt meines ursprünglichen Schreibens) ist, dass sich PHP, wenn es sich auf Trennzeichen bezieht, nicht auf die Trennzeichen bezieht, die Sie in Ihrem Code sehen (die Anführungszeichen sind), sondern auf das nächste Zeichen innerhalb der Zeichenfolge. (Tatsächlich habe ich dies noch nie in einer Dokumentation gesehen: Sie müssen es in Beispielen sehen.) Anstatt also eine Syntax für reguläre Ausdrücke zu haben, wie Sie es von vielen anderen Sprachen gewohnt sind:

/something/

PHP verwendet Zeichenfolgen und sucht dann in der Zeichenfolge nach einem anderen Trennzeichen:

'/something/'

Das Trennzeichen, auf das sich PHP bezieht, ist das /Zeichenpaar anstelle des 'Zeichenpaars. Wenn Sie also schreiben 'something', nimmt PHP sdas beabsichtigte Trennzeichen und beschwert sich, dass Sie keine alphanumerischen Zeichen als Trennzeichen verwenden dürfen.

Wenn Sie also (zum Beispiel) eine übergeben möchten, um izu zeigen, dass Sie eine Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung wünschen, übergeben Sie diese innerhalb der Zeichenfolge, jedoch außerhalb der Regex-Begrenzer:

'/something/i'

Wenn Sie etwas anderes als /Ihr Trennzeichen verwenden möchten , können Sie dies tun, z. B. wenn Sie mit einer URL übereinstimmen und nicht alle Schrägstriche umgehen müssen:

'~something~'
Bilderstürmer
quelle
1
@Gruber: danke! Sie können jederzeit alle Ihre Freunde Links dazu senden und sie es abstimmen lassen;)
Bilderstürmer
1
Erklären, welche Dokumentation nicht erklärt .. +1 Danke!
Ju Oliveira
Die am höchsten bewertete Antwort ist dieselbe wie diese. Ich bin jedoch dankbar, jetzt zu verstehen, warum dies die richtige Antwort ist. +1 Danke!
Eklektischer
21

Sie müssen ein Trennzeichen für Ihren Ausdruck angeben. Ein Trennzeichen ist ein Sonderzeichen, das am Anfang und Ende Ihres Ausdrucks verwendet wird, um anzugeben, welcher Teil der Ausdruck ist. Auf diese Weise können Sie Modifikatoren und den Interpreter verwenden, um zu wissen, welcher Ausdruck und welche Modifikatoren sind. Wie in der Fehlermeldung angegeben, kann das Trennzeichen kein Backslash sein, da der Backslash das Escape-Zeichen ist.

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

und unter dem gleichen Beispiel, jedoch mit dem iModifikator, der übereinstimmt, ohne zwischen Groß- und Kleinschreibung zu unterscheiden.

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

Wie Sie sehen können, ibefindet sich das außerhalb der Schrägstriche und wird daher als Modifikator interpretiert.

Beachten Sie auch, dass Sie, wenn Sie einen Schrägstrich (/) als Trennzeichen verwenden, weiteren Verwendungen von / im regulären Ausdruck entgehen müssen, falls vorhanden.

Ben Swinburne
quelle
7

Das Muster muss Trennzeichen haben. Trennzeichen können ein Schrägstrich (/) oder beliebige nicht alphanumerische Zeichen (#, $, *, ...) sein. Beispiele

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

Möglicherweise nicht mit dem ursprünglichen Codebeispiel verbunden, aber ich habe den Fehler "Trennzeichen darf nicht alphanumerisch oder Backslash sein" erhalten und hier gegoogelt. Grund: Ich habe die Reihenfolge der Parameter für preg_match gemischt. Das Muster war der zweite Parameter und die übereinstimmende Zeichenfolge war der erste. Achtung :)

Nubian
quelle
-2

Bitte versuchen Sie es damit

 $pattern = "/My name is '\(.*\)' and im fine/"; 
Vikas Naranje
quelle
Warum Klammern entkommen?
Ki Jéy
1
@kiJey. In der Situation des OP wollten sie den Namen extrahieren, daher sind die Klammern für die Übereinstimmung erforderlich und dürfen daher NICHT maskiert werden. Deshalb stimme ich es ab.
Patanjali