2009-08-14 9 views
62

¿Cómo se puede quitar espacios en blanco en la variable de PHP?Para quitar espacios en blanco dentro de una variable en PHP

Sé esto comment PHP.net. me gustaría tener una herramienta similar como tr para PHP tal que se puede ejecutar simplemente

tr -d " " "" 

corro, sin éxito, la función php_strip_whitespace por

$tags_trimmed = php_strip_whitespace($tags); 

corro la función de expresiones regulares también sin éxito

$tags_trimmed = preg_replace(" ", "", $tags); 
+0

posible duplicado de [No se puede obtener str \ _replace() para quitar espacios en una cadena PHP] (http://stackoverflow.com/questions/16563421/cant-get-str-replace-to-strip- out-spaces-in-a-php-string) –

+1

@taztodgmail Mira las fechas. Esto es 2009 y el otro es 2013. El 2013 es un duplicado de esto. –

+1

FYI: el indicador \ s no incluye caracteres utf-8 como nbsp; codificado en utf-8 ;, ps, quads y fs http://stackoverflow.com/questions/2227921/simplest-way-to-get-a- complete-list-of-all-the-utf-8-whitespace-characters-in-ph – ppostma1

Respuesta

25

Una expresión regular no tiene en cuenta UTF-8 caracteres por defecto. El meta-personaje \s solo cuenta para el conjunto latino original. Por lo tanto, el siguiente comando sólo elimina las pestañas, espacios, retornos de carro y nuevas líneas

// http://stackoverflow.com/a/1279798/54964 
$str=preg_replace('/\s+/', '', $str); 

Con UTF-8 convirtiéndose en la corriente principal de esta expresión será más frecuencia fallar/alto cuando se llega a los nuevos caracteres UTF-8, dejando espacios en blanco detrás de eso, el \s no puede explicar.

Para tratar con los nuevos tipos de espacios en blanco presentados en unicode/utf-8, se necesita una cadena más extensa para unir y eliminar el espacio en blanco moderno.

Dado que las expresiones regulares de forma predeterminada no reconocen caracteres multibyte, solo se puede utilizar una meta cadena delimitada para identificarlos, para evitar que los segmentos de bytes se alteren en otros caracteres utf-8 (\x80 en el conjunto quad podría reemplazar todos \x80 sub-bytes en citas inteligentes)

$cleanedstr = preg_replace(
    "/(\t|\n|\v|\f|\r| |\xC2\x85|\xc2\xa0|\xe1\xa0\x8e|\xe2\x80[\x80-\x8D]|\xe2\x80\xa8|\xe2\x80\xa9|\xe2\x80\xaF|\xe2\x81\x9f|\xe2\x81\xa0|\xe3\x80\x80|\xef\xbb\xbf)+/", 
    "_", 
    $str 
); 

Esto explica y elimina pestañas, saltos de línea, pestañas verticales, formfeeds, retornos de carro, espacios y adicionalmente de here:

nextLine, no espacios de separación, separador de vocales mongol, [en quad, em quad, en space, em space, espacio de tres por em, espacio de cuatro por em, espacio de six-per-em, espacio de figura, espacio de puntuación, espacio delgado , espacio de pelo, espacio de ancho cero, no-carpintero de ancho cero, carpintero de ancho cero], separador de líneas, separador de párrafos, espacio estrecho sin interrupciones, espacio matemático medio, carpintero de palabras, espacio ideográfico y espacio sin ruptura de ancho cero.

Muchos de éstos causan estragos en archivos XML cuando se exportan desde herramientas o sitios que ensucian las búsquedas de texto, reconocimiento automatizados, y se puede pegar de forma invisible en el código fuente PHP que hace que el analizador para salto al siguiente orden (separadores de párrafos y líneas) que hace que las líneas de código salten dando como resultado errores intermitentes e inexplicables que hemos comenzado a llamar "enfermedades de transmisión textual"

[Ya no es seguro copiar y pegar desde la web. Use un escáner de caracteres para proteger su código.lol]

+1

¿Te gusta? Intenté explicar que el anterior ya no funciona como debería – ppostma1

+0

¡Excelente! ¿Puedes incluir el recuento de los personajes que tienes en tu set? - - Esto nos ayudará a identificar que realmente tienes un conjunto completo de esos personajes. - - Acepté su respuesta porque ahora es más completa que la antigua respuesta aceptada. –

+0

¡Gracias por la ayuda @Masi! – ppostma1

10
$string = str_replace(" ", "", $string); 

creo preg_repla ce estaría buscando algo así como [:space:]

5

Si desea eliminar todos los espacios en blanco en todas partes desde $ etiquetas ¿por qué no:

str_replace(' ', '', $tags); 

Si desea eliminar nuevas líneas y tal que requeriría un poco más. ..

+2

si no asigna el resultado a una variable, esto en realidad no haría nada útil. –

+0

Paul Dixon ¿cuál es una variable? Estoy programando pero no sé qué es una variable ... ¿Para qué sirve? ¿Puedo encontrar esto en la web? ¿Es importante saber lo que significa? ¿Por qué ponen $ antes del nombre? –

130

para despojar cualquier espacio en blanco, se puede utilizar una expresión regular

$str=preg_replace('/\s+/', '', $str); 

S ee también this answer para algo que puede manejar espacios en blanco en cadenas UTF-8.

+19

+1 porque esto elimina todos los espacios en blanco y no solo los espacios. – MitMaro

+1

+1 Esto es perfecto, exactamente lo que necesitaba. Gracias. –

+0

Cualquier otra solución. Esto (preg_replace) falla para mí. – Kathir

23

A veces necesitaría eliminar espacios en blanco consecutivos. Puede hacerlo de esta manera:

$str = "My name is"; 
$str = preg_replace('/\s\s+/', ' ', $str); 

Salida:

My name is 
+0

Gracias. Exactamente lo que estaba buscando – Lomse

+0

yeh ... funciona bien ... :) –

2

Cualquier opción posible es utilizar envoltorio de archivo personalizado para la simulación de las variables como archivos. Se puede lograr mediante el uso de esto:

1) En primer lugar, inscriba su envoltorio (sólo una vez en el archivo, usarlo como session_start()):

stream_wrapper_register('var', VarWrapper); 

2) A continuación, defina su clase contenedora (en realidad está escrito rápido, no del todo correcta, pero funciona):

class VarWrapper { 
    protected $pos = 0; 
    protected $content; 
    public function stream_open($path, $mode, $options, &$opened_path) { 
    $varname = substr($path, 6); 
    global $$varname; 
    $this->content = $$varname; 
    return true; 
    } 
    public function stream_read($count) { 
    $s = substr($this->content, $this->pos, $count); 
    $this->pos += $count; 
    return $s; 
    } 
    public function stream_stat() { 
    $f = fopen(__file__, 'rb'); 
    $a = fstat($f); 
    fclose($f); 
    if (isset($a[7])) $a[7] = strlen($this->content); 
    return $a; 
    } 
} 

3) a continuación, utilice cualquier función de archivo con su envoltorio en var: // protocolo (se puede utilizar para incluir, requieren etc.también):

global $__myVar; 
$__myVar = 'Enter tags here'; 
$data = php_strip_whitespace('var://__myVar'); 

Nota: No se olvide de tener la variable en el ámbito global (como mundial $ __ miVar)

+0

Esto es complejo, los principiantes pueden no desear echarle un vistazo a esto. Pero para mostrar el esfuerzo te votaré de vuelta para que el -1 en esta publicación sea eliminado – Ironwind

+0

Sí, sé que es muy complejo, pero funciona y en algunos casos es realmente poderoso. Y desafortunadamente, es la única forma (en lugar de crear tempfiles, lo cual es feo) de cómo enviar variables a funciones que solo funcionan con archivos (y php_strip_whitespace no es el único). Por ejemplo, puedes sustituir el código antes de requerirlo: puedes crear tu propio "precompilador" para PHP donde puedes hacer lo que quieras. Lo uso y se vuelve muy poderoso y útil durante años de programación. –

1

Usted puede hacerlo mediante el uso de ereg_replace

$str = 'This Is New Method Ever'; 
$newstr = ereg_replace([[:space:]])+', '', trim($str)): 
echo $newstr 
// Result - ThisIsNewMethodEver 
+0

ereg está en desuso desde PHP 5.3 – Soaku

6

Se puede utilizar recortar la función de php para recortar ambos lados (izquierdo y derecho)

trim($yourinputdata," "); 

O

trim($yourinputdata); 

También puede utilizar

ltrim() - Removes whitespace or other predefined characters from the left side of a string 
rtrim() - Removes whitespace or other predefined characters from the right side of a string 

sistema: PHP 4,5,7
Docs: http://php.net/manual/en/function.trim.php

+1

Esta debería ser la respuesta correcta como lo hace de forma nativa, exactamente lo que pide el OP. Es pequeño, limpio y "ampliable" al agregar carbón extra para recortar. –

+0

Recortar no elimina los espacios DENTRO de la cadena, solo a la izquierda y derecha. Por cierto, el espacio está predeterminado en trim, no tienes que dar el segundo argumento – Soaku

1

usted también usa la función preg_replace_callback. y esta función es idéntica a su hermano preg_replace, excepto que puede tomar una función de devolución de llamada que le da más control sobre cómo manipula su salida.

$str = "this is a string"; 

echo preg_replace_callback(
     '/\s+/', 
     function ($matches) { 
      return ""; 
     }, 
     $str 
    ); 
+1

Es una buena práctica en Stack Overflow agregar una explicación de por qué su solución debería funcionar. Para obtener más información, lea [Cómo responder] (// stackoverflow.com/help/how-to-reswer). –

+0

¿Puede agregar ejemplos en qué casos la devolución de llamada es útil con 'preg_replace'? –

0

es antiguo puesto, pero se puede hacer así:

if(!function_exists('strim')) : 
function strim($str,$charlist=" ",$option=0){ 
    $return=''; 
    if(is_string($str)) 
    { 
     // Translate HTML entities 
     $return = str_replace(" "," ",$str); 
     $return = strtr($return, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES))); 
     // Choose trim option 
     switch($option) 
     { 
      // Strip whitespace (and other characters) from the begin and end of string 
      default: 
      case 0: 
       $return = trim($return,$charlist); 
      break; 
      // Strip whitespace (and other characters) from the begin of string 
      case 1: 
       $return = ltrim($return,$charlist); 
      break; 
      // Strip whitespace (and other characters) from the end of string 
      case 2: 
       $return = rtrim($return,$charlist); 
      break; 

     } 
    } 
    return $return; 
} 
endif; 

ajuste estándar() pueden ser un problema cuando vienen las entidades HTML. Es por eso que escribí la función "Super Trim" que se usa para manejar este problema y también puedes elegir recortar desde el principio, el final o el lado del stand de la cuerda.

Cuestiones relacionadas