2009-01-24 7 views
25

Je suis en train de dépouiller tous les signes de ponctuation sur une chaîne en utilisant une expression régulière simple et la fonction php preg_replace, bien que je reçois l'erreur suivante:PHP regex: qu'est ce que "class at offset 0"?

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

Je suppose que cela signifie que je ne peux pas utiliser Posix appelé classes à l'extérieur d'une classe au décalage 0. Ma question est, qu'est-ce que cela signifie quand il dit "dans une classe à l'offset 0"?

$string = "I like: perl";  

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

Désolé pour le manque de balises, je recevais une erreur lors de l'attacher pour marquer cette question . "Vous ne pouvez pas ajouter de nouvelles balises, s'il vous plaît utiliser des balises existantes" .. Comment suis-je censé savoir ce que cela signifie? –

+0

J'ai corrigé les étiquettes. Je pense qu'il y a un bug dans votre programme: voulez-vous dire que l'écho doit se produire à l'extérieur ou à l'intérieur du bloc if? – strager

+0

Je pense que vous avez besoin d'un certain niveau de réputation pour créer un nouveau tag. Mais le message d'erreur est pauvre. Vous pourriez peut-être suggérer une modification au site de commentaires UserVoice énuméré ci-dessous. VVVVVV –

Répondre

39

Le preg_* functions attendent Perl compatible regular expressions avec délimiteurs. Donc, essayez ceci:

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

Fantastique, non seulement cela résout mon problème, mais j'ai aussi appris quelque chose de nouveau sur le fonctionnement de preg_ *. Merci :) –

5

NOTE: Le modificateur g n'est pas nécessaire avec la mise en œuvre de PHP PCRE!

En plus de Gumbo's answer, utilisez le modificateur g pour remplacer tous occurences de ponctuation:

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

De Johnathan Lonowski (voir les commentaires):

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

Je suis assez nouveau à la complexité des expressions régulières, ce qui est «spécifiquement» la définition de «g»? Je suppose que vous avez dit que c'est une façon de dire à l'expression rationnelle d'être récursive? –

+0

@chris: Cela signifie "Global" - c'est-à-dire, trouver toutes les correspondances existantes. Sans cela, les fonctions regex arrêteront de chercher après le premier match. –

+0

@Lonowski, merci; J'ai mis à jour ma réponse avec vos informations./ – strager

0

Une explication de pourquoi vous obtenez cette erreur: PCRE utilise la définition lâche de Perl de ce qu'est un délimiteur. Vos [] externes lui ressemblent comme des délimiteurs valides, l'obligeant à lire [:punct:] comme partie regex.

(Oh, et éviter les ereg fonctions si vous le pouvez -. Ils ne vont pas être inclus dans PHP 5.3)

+0

Existe-t-il une alternative à ereg_replace pour ce que je fais? –

+0

@chris, Il a dit ereg, tu utilises preg_replace, tu utilises aussi eregi ( – strager

+0

Désolé, moment de concentration nulle. voyez ce qu'il dit maintenant. –

0

Je viens d'ajouter g à l'expression rationnelle comme suggéré dans l'un des anwers, il a fait le contraire de wahts attendu et n'a pas filtré la ponctuation, s'avère preg_replace ne nécessite pas g car il est global/récursif en premier lieu