2009-02-18 17 views
147

Necesito hacer coincidir un carácter de espacio en una expresión regular de PHP. ¿Alguien tiene alguna idea?Coincidencia de un espacio en la expresión regular

Me refiero a "gavin schulz", el espacio entre las dos palabras. Estoy usando una expresión regular para asegurarme de que solo permito letras, números y un espacio. Pero no estoy seguro de cómo encontrar el espacio. Esto es lo que tengo en este momento:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag); 
+2

Hmm ... también hay ninguna duda sobre la correspondencia de una 'a' o 'b' ...;) – hop

+1

debería ver los ejemplos de expresiones regulares [] (http://stackoverflow.com/questions/16166819/php-regular-expressions) –

Respuesta

261

Si usted está buscando un espacio, que sería " " (un espacio).

Si usted está buscando para uno o más, es " *" (que es dos espacios y un asterisco) o " +" (un espacio y un plus).

Si usted está buscando para el espaciamiento común, usar o "[ X]""[ X][ X]*" o "[ X]+" donde X es el carácter de tabulación física (y cada uno está precedido por un solo espacio en todos los ejemplos).

Estos trabajarán en cada * motor de expresiones regulares que he visto nunca (algunos de los cuales ni siquiera tienen el uno-o-más "+" carácter, uf).

Si sabe que utilizará uno de los motores de expresiones regulares más modernos, "\s" y sus variaciones son el camino a seguir. Además, creo que los límites de las palabras también coinciden con el inicio y el final de las líneas, importante cuando busca palabras que pueden aparecer sin espacios anteriores o posteriores.

Para PHP específicamente, this page puede ayudar.

De tu edición, parece que desea eliminar todos los caracteres no válidos El inicio de este está (tenga en cuenta el espacio dentro de la expresión regular):

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag); 
#         ^space here 

Si también desea el engaño para asegurar que sólo hay un espacio entre cada palabra y ninguno al principio o al final, eso es un poco más complicado (y probablemente otra pregunta), pero la idea básica sería:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space 
$newtag = preg_replace ("/^ /", "", $tag); # remove space from start 
$newtag = preg_replace ("/ $/", "", $tag); # and end 
+0

Su expresión regular original parecía querer reemplazar el carácter "". Estás negando el espacio, por lo tanto, su espacio no será "eliminado" como se pretendía. – Suroot

+0

Citando: "solo permite letras, números y espacios", la RE original de Gavin estaba equivocada (razón por la cual estaba haciendo la pregunta). Mi RE elimina todo lo que no es uno de esos. – paxdiablo

+0

¿Por qué el espacio debe estar al final del patrón de coincidencia en lugar de, por ejemplo, en el medio? – warren

5

En Perl el interruptor es \s (espacio en blanco).

+3

Esto es incorrecto: reúne todos los espacios en blanco, no solo el carácter de espacio. –

3

También puede usar el \ b para un límite de palabras. Para obtener el nombre usaría algo como esto:

[^\b]+\b[^\b]+(\b|$) 

EDITAR La modificación que se trata de una expresión regular en el ejemplo Perl

if($fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/) { 
$first_name = $1; 
$last_name = $2; 
} 

nuevo EDIT Sobre la base de lo que quiere:

$new_tag = preg_replace("/[\s\t]/","",$tag); 
5

Me parece que usar un REGEX en este caso sería exagerado. ¿Por qué no solo strpos para encontrar el carácter de espacio? Además, no hay nada de especial en el carácter de espacio en las expresiones regulares, debería poder buscarlo de la misma manera que buscaría cualquier otro personaje. Es decir, a menos que haya desactivado el espacio en blanco del patrón, lo que difícilmente sería necesario en este caso.

3

estoy usando una expresión regular para asegurarse de que sólo permiten letras, número y un espacio

entonces es tan simple como añadir un espacio a lo que ya tienes:

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag); 

(nota, me quita el s| que parecía no intencional? Ciertamente, el s era redundante; puede restaurar el | si lo necesita)

Si desea específicamente * un espacio *, como en única una sola, se necesita una expresión más compleja que esto, y tal vez quiera considerar por separado una pieza de lógica regex.

0

Estoy probando [[: space:]] en una instancia en la que parece que los bloggers en WordPress están utilizando caracteres espaciales no estándar. Parece que funcionará.

1

Utilícelo de esta manera para permitir un espacio simple.

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag) 
0

Aquí es un todo lo que necesita saber acerca de los espacios en blanco en las expresiones regulares:

  • [[:blank:]] espaciadora o ficha sólo
  • [[:space:]] espacios en blanco
  • \s Cualquier carácter de espacio en blanco
  • \v espacio en blanco vertical
  • \h espacio en blanco horizontal
  • x Ignorar espacios en blanco
Cuestiones relacionadas