Emparejar un espacio en expresiones regulares

229

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

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

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);
Gavin Schulz
fuente
2
Hmm ... tampoco hay dudas acerca de hacer coincidir una 'a' o una 'b' ...;)
1
deberías ver los ejemplos de
expresiones

Respuestas:

368

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

Si está buscando uno o más, es " *"(son dos espacios y un asterisco) o " +"(un espacio y un signo más).

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

Estos funcionarán en todos los motores * regex que he visto (algunos de los cuales ni siquiera tienen el carácter de uno o más "+", ugh).

Si sabe que usará uno de los motores regex 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, lo que es importante cuando busca palabras que pueden aparecer sin espacios anteriores o siguientes.

Para PHP específicamente, esta página puede ayudar.

De su edición, parece que desea eliminar todos los caracteres no válidos. El comienzo de esto es (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 trucos para asegurarse de que solo 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
paxdiablo
fuente
Su expresión regular original parecía querer reemplazar el "" personaje. Usted está negando el espacio, por lo tanto, su espacio no se "eliminará" según lo previsto.
Suroot
Citando: "solo permite letras, números y un espacio", el RE original de Gavin estaba equivocado (por eso estaba haciendo la pregunta). Mi RE elimina todo lo que no es uno de esos.
paxdiablo
¿Por qué el espacio tiene que estar al final del patrón de coincidencia en lugar de, por ejemplo, en el medio?
warren
1
@warren, no lo hace. El comentario de 'espacio aquí' no indicaba a dónde iba el espacio, más bien indicaba que había un espacio allí (en caso de que el lector no se diera cuenta).
paxdiablo
@ Mike, no, ese no es el caso. La intención aquí es reemplazar todos los caracteres que no están en el conjunto A-Za-z.... El cursor dentro de los corchetes dicta eso. Mover el cursor fuera de los corchetes cambia su significado a caracteres coincidentes en el conjunto al comienzo de la cadena.
paxdiablo
34

Aquí hay todo lo que necesita saber sobre espacios en blanco en expresiones regulares:

  • [[:blank:]] Solo espacio o tabulación
  • [[:space:]] Espacio en blanco
  • \s Cualquier caracter de espacio en blanco
  • \v Espacio en blanco vertical
  • \h Espacio en blanco horizontal
  • x Ignorar espacios en blanco
Fletcher Ripp
fuente
5

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

Kibbee
fuente
5

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

Elsporko
fuente
16
Esto es incorrecto: reúne todos los espacios en blanco, no solo el carácter de espacio.
J. Taylor
Pero la pregunta está etiquetada con PHP, no con Perl.
Peter Mortensen el
4

Estoy usando una expresión regular para asegurarme de que solo permita letras, números y un espacio

Entonces es tan simple como agregar un espacio a lo que ya tienes:

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

(nota, ¿eliminé el s|que parecía no intencional? Ciertamente sera redundante; puede restaurarlo |si lo necesita)

Si desea específicamente * * un espacio, como en solamente uno solo, se necesita una expresión más compleja que esto, y podría considerar una pieza no separada de la lógica de expresiones regulares.

Peter Boughton
fuente
3

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

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

EDITAR Modificar esto para que sea una expresión regular en el ejemplo de Perl

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

EDITAR DE NUEVO Basado en lo que quieres:

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

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

Jeremy Schultz
fuente
1

Úselo así para permitir un espacio único.

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