2009-01-24 4 views
25

Ich versuche, alle Interpunktion aus einer Zeichenfolge strippen mit einem einfachen regulären Ausdruck und die PHP-preg_replace-Funktion, obwohl ich die folgenden Fehlermeldung:PHP Regex: Was ist "Klasse bei Offset 0"?

Compilation failed: POSIX named classes are supported only within a class at offset 0

Ich denke, das bedeutet, dass ich nicht POSIX genannt verwenden kann Klassen außerhalb einer Klasse bei Offset 0. Meine Frage ist, was bedeutet es, wenn es heißt "innerhalb einer Klasse bei Offset 0"?

$string = "I like: perl";  

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

Sorry über das Fehlen von Tags, bekam ich einen Fehler beim Binden um diese Frage zu markieren . "Sie können keine neuen Tags hinzufügen, verwenden Sie bitte vorhandene Tags". Wie soll ich wissen, was das bedeutet? –

+0

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

+0

Ich denke, du brauchst ein gewisses Ansehen, um ein neues Tag zu erstellen. Aber die Fehlermeldung ist schlecht. Vielleicht können Sie eine Änderung der unten aufgeführten UserVoice-Feedbackseite vorschlagen. VVVVVV –

Antwort

39

Die preg_* functionsPerl compatible regular expressions mit Trennzeichen erwartet. Also versuchen Sie dies:

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

Fantastisch, das löst nicht nur mein Problem, sondern ich habe auch etwas Neues darüber gelernt, wie preg_ * funktioniert. Danke :) –

5

HINWEIS: Der g Modifikator ist nicht erforderlich mit PHP PCRE Implementierung!

Neben Gumbo's answer, verwenden Sie den g Modifikator alle Vorkommen von Interpunktion zu ersetzen:

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. 
+0

Ich bin ziemlich neu in der Komplexität der regulären Ausdrücke, was "spezifisch" ist die Definition von "g"? Ich nehme an, dass du gesagt hast, dass es eine Art ist, der Regexp zu sagen, dass sie rekursiv ist? –

+0

@chris: Es bedeutet "Global" - d. H. Alle vorhandenen Übereinstimmungen finden. Ohne es, Regex-Funktionen hören auf, nach dem ersten Spiel zu suchen. –

+0

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

0

Eine Erklärung warum Sie erhalten diesen Fehler: PCRE verwendet die lose Definition von Perl, was ein Begrenzer ist. Ihre äußeren [] s sehen wie gültige Begrenzer dazu aus, was dazu führt, dass sie [:punct:] als Regex-Teil liest.

-

+0

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

+0

@chris, Er sagte ereg. Sie verwenden preg_replace. Sie verwenden auch eregi (was in dieser Situation nicht notwendig ist, worüber @Ant sprach. – strager

+0

Entschuldigung, Moment der Null-Konzentration Seht, was er jetzt sagt. –

0

ich gerade hinzugefügt g auf die regexp (Oh, und vermeiden Sie die ereg Funktionen, wenn Sie können. Sie sind nicht in PHP 5.3 enthalten gehen werden), wie in einem der Anwers vorgeschlagen, es tat das Gegenteil von Wahts erwartet und nicht herausgefiltert die Interpunktion, stellt sich heraus preg_replace erfordert nicht g, wie es global/rekursiv ist in erster Linie