PHP-Regex: Was ist “Klasse bei Offset 0”?

Lesezeit: 3 Minuten

Ich versuche, alle Satzzeichen mit einem einfachen regulären Ausdruck und der PHP-Funktion preg_replace aus einer Zeichenfolge zu entfernen, obwohl ich die folgende Fehlermeldung erhalte:

Kompilierung fehlgeschlagen: Benannte POSIX-Klassen werden nur innerhalb einer Klasse bei Offset 0 unterstützt

Ich denke, das bedeutet, dass ich keine benannten POSIX-Klassen außerhalb einer Klasse bei Offset 0 verwenden kann. Meine Frage ist, was bedeutet es, wenn “innerhalb einer Klasse bei Offset 0” steht?

$string = "I like: perl";    

if (eregi('[[:punct:]]', $string))  
    $new = preg_replace('[[:punct:]]', ' ', $string); echo $new;

  • Entschuldigung für das Fehlen von Tags, ich habe eine Fehlermeldung erhalten, als ich diese Frage verknüpft habe. “Sie können keine neuen Tags hinzufügen, verwenden Sie bitte vorhandene Tags”. Woher soll ich wissen, was das bedeutet?

    Chris

    24. Januar 2009 um 0:14 Uhr

  • Ich habe die Tags repariert. Ich denke, es gibt einen Fehler in Ihrem Programm: Wollten Sie, dass das Echo außerhalb oder innerhalb des if-Blocks auftritt?

    – Nachzügler

    24. Januar 2009 um 0:17 Uhr

  • Ich denke, Sie brauchen ein gewisses Maß an Reputation, um ein neues Tag zu erstellen. Aber die Fehlermeldung ist dürftig. Vielleicht könnten Sie eine Änderung der unten aufgeführten UserVoice-Feedback-Site vorschlagen. VVVVVV

    – JonEricson

    24. Januar 2009 um 0:19 Uhr

Das preg_* Funktionen erwarten von Perl-kompatible reguläre Ausdrücke mit Trennzeichen. Versuchen Sie also Folgendes:

preg_replace('/[[:punct:]]/', ' ', $string)

  • Fantastisch, das löst nicht nur mein Problem, sondern ich habe auch etwas Neues darüber gelernt, wie preg_* funktioniert. Vielen Dank 🙂

    Chris

    24. Januar 2009 um 0:24 Uhr

Benutzer-Avatar
Nachzügler

Beachten Sie das g Modifikator wird bei PHP nicht benötigt PCRE Implementierung!

Verwenden Sie zusätzlich zu Gumbos Antwort die g Modifikator zu ersetzen alle Vorkommen von Satzzeichen:

preg_replace('/[[:punct:]]/g', ' ', $string)
//                         ^

Von Johnathan Lonowski (siehe Kommentare):

> [The g modifier] means "Global" -- i.e., find all existing matches. Without it, regex functions will stop searching after the first match.

  • Ich bin ziemlich neu in der Komplexität regulärer Ausdrücke, was “speziell” ist die Definition von “g”? Ich würde davon ausgehen, dass Sie gesagt haben, dass dies eine Möglichkeit ist, der Regexp zu sagen, dass sie rekursiv ist?

    Chris

    24. Januar 2009 um 0:29 Uhr

  • @chris: Es bedeutet “Global” – dh alle vorhandenen Übereinstimmungen finden. Ohne sie stoppen Regex-Funktionen die Suche nach der ersten Übereinstimmung.

    – Jonathan Lonowski

    24. Januar 2009 um 0:33 Uhr

  • @Lonowski, danke; Ich habe meine Antwort mit Ihren Informationen aktualisiert.

    – Nachzügler

    24. Januar 2009 um 0:38 Uhr

  • /g bedeutet global, was Regex anweist, alle Instanzen zu ersetzen. echo “Was ist los?”|sed “s/[[:punct:]]/ /” Was ist los? echo “Was ist los?”|sed “s/[[:punct:]]/ /g” Was ist los? Aber strager liegt falsch. preg_replace ist /default/ global. echo preg_replace(‘/[[:punct:]]/’, ‘ ‘, “Was ist los?”); Was ist los

    – Matthäus Flaschen

    24. Januar 2009 um 0:41 Uhr

  • In diesem Aspekt folgt die PHP-Implementierung nicht wirklich dem Perl-Standard. Die Funktion preg_replace() ersetzt immer alle Übereinstimmungen.

    – Gumbo

    24. Januar 2009 um 0:44 Uhr

Eine Erklärung bzgl warum Sie erhalten diesen Fehler: PCRE verwendet Perls lose Definition dessen, was ein Trennzeichen ist. Dein Äußeres []s sehen für ihn wie gültige Trennzeichen aus, was dazu führt, dass er gelesen wird [:punct:] als Regex-Teil.

(Oh, und vermeiden Sie die ereg Funktionen, wenn Sie können – sie werden nicht in PHP 5.3 enthalten sein.)

  • Gibt es eine Alternative zu ereg_replace für das, was ich tue?

    Chris

    24. Januar 2009 um 0:33 Uhr

  • @chris, er sagte ereg. Sie verwenden preg_replace. Sie verwenden auch eregi (was in dieser Situation nicht wirklich notwendig ist), wovon @Ant gesprochen hat.

    – Nachzügler

    24. Januar 2009 um 0:39 Uhr

  • Entschuldigung, Moment der Nullkonzentration. Ich verstehe, was er jetzt sagt.

    Chris

    24. Januar 2009 um 0:47 Uhr

Ich habe gerade g zum regulären Ausdruck hinzugefügt, wie in einer der Antworten vorgeschlagen, es hat das Gegenteil von was erwartet und die Interpunktion NICHT herausgefiltert, es stellt sich heraus, dass preg_replace kein g benötigt, da es in erster Linie global/rekursiv ist

1146470cookie-checkPHP-Regex: Was ist “Klasse bei Offset 0”?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy