2009-01-24 14 views
25

estoy tratando de despojar a todos los puntuacion de una cadena usando un simple expresión regular y la función de PHP preg_replace, aunque me sale el siguiente error:PHP regex: ¿qué es "class at offset 0"?

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

supongo que esto significa que no puedo usar el nombre POSIX clases fuera de una clase en offset 0. Mi pregunta es, ¿qué significa cuando dice "dentro de una clase en offset 0"?

$string = "I like: perl";  

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

Lo siento por la falta de etiquetas, me estaba dando un error al vincularme para etiquetar esta pregunta . "No puedes agregar nuevas etiquetas, usa etiquetas existentes". ¿Cómo se supone que sabré lo que eso significa? –

+0

He arreglado las etiquetas. Creo que hay un error en tu programa: ¿quisiste decir que el eco ocurre dentro o fuera del bloque if? – strager

+0

Creo que necesita cierto nivel de reputación para crear una nueva etiqueta. Pero el mensaje de error es pobre. Tal vez podría sugerir un cambio en el sitio de comentarios de UserVoice que se detalla a continuación. VVVVVV –

Respuesta

39

El preg_* functions esperan Perl compatible regular expressions con delimitadores. Así que trate de esto:

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

Fantástico, esto no solo resuelve mi problema, sino que también aprendí algo nuevo sobre cómo funciona preg_ *. Gracias :) –

5

NOTA: El modificador g no se necesita con PCRE aplicación de PHP!

Además de Gumbo's answer, utilice el modificador g para reemplazar todos ocurrencias de puntuacion:

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

De Johnathan Lonowski (ver comentarios):

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

Soy bastante nuevo en las complejidades de las expresiones regulares, ¿qué "específicamente" es la definición de 'g'? Supongo que has dicho que es una forma de decirle a la expresión regular que sea recursiva. –

+0

@chris: Significa "Global", es decir, busca todas las coincidencias existentes. Sin él, las funciones de expresiones regulares dejarán de buscar después de la primera coincidencia. –

+0

@Lonowski, gracias; He actualizado mi respuesta con su información. – strager

0

Una explicación de qué está obteniendo ese error: PCRE usa la definición suelta de Perl de lo que es un delimitador. Su exterior [] s parece delimitadores válidos, haciendo que lea [:punct:] como la parte de expresión regular.

(Ah, y evitar las funciones ereg si puedes -. Que está no va a ser incluido en PHP 5.3)

+0

¿Hay una alternativa para ereg_replace para lo que estoy haciendo? –

+0

@chris, dijo ereg. Estás usando preg_replace. También estás usando eregi (que no es necesario, realmente, en esta situación) que es de lo que @Ant hablaba. – strager

+0

Lo siento, momento de cero concentrtion. mira lo que está diciendo ahora. –

0

simplemente he añadido g de la expresión regular como se sugiere en uno de los anwers, lo hizo el opuesto de wahts esperado y NO filtró la puntuación, resulta que preg_replace no requiere g ya que es global/recursivo en primer lugar