¿Cómo se pueden eliminar los espacios en blanco en la variable de PHP?

79

Conozco este comentario PHP.net. Me gustaría tener una herramienta similar tra PHP tal que pueda ejecutar simplemente

tr -d " " ""

Ejecuto sin éxito la función php_strip_whitespacepor

$tags_trimmed = php_strip_whitespace($tags);

Ejecuto la función regex también sin éxito

$tags_trimmed = preg_replace(" ", "", $tags);
Léo Léopold Hertz 준영
fuente
1
@taztodgmail Mira las fechas. Esto es 2009 y el otro es 2013. El 2013 es un duplicado de esto.
Léo Léopold Hertz 준영
1
FYI: el indicador \ s no incluye caracteres utf-8 como nbsp codificado en utf-8 ;, ps, quads y fs stackoverflow.com/questions/2227921/…
ppostma1
1
¡Por supuesto! Tengo un conjunto de código que lo aborda
ppostma1
¿Por qué aparece esto en la portada?
Jonathan dos Santos

Respuestas:

48

Una expresión regular no tiene en cuenta los caracteres UTF-8 de forma predeterminada. El \smetacarácter solo representa el conjunto latino original. Por lo tanto, el siguiente comando solo elimina tabulaciones, 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, esta expresión fallará o se detendrá con más frecuencia cuando alcance los nuevos caracteres utf-8, dejando espacios en blanco que \sno se pueden explicar.

Para hacer frente a los nuevos tipos de espacios en blanco introducidos en unicode / utf-8, se requiere una cadena más extensa para hacer coincidir y eliminar los espacios en blanco modernos.

Debido a que las expresiones regulares por defecto no reconocen caracteres multibyte, solo se puede usar una metacadena delimitada para identificarlos, para evitar que los segmentos de bytes sean alterados en otros caracteres utf-8 ( \x80en el conjunto cuádruple podría reemplazar todos \x80los subbytes entre comillas tipográficas)

$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 tiene en cuenta y elimina pestañas, nuevas líneas, pestañas verticales, avances de formulario, retornos de carro, espacios y, además, de aquí :

siguiente línea, espacios sin interrupción, separador de vocales de mongolia, [en quad, em quad, en espacio, espacio em, espacio tres por em, espacio cuatro por em, espacio seis por em, espacio para figuras, espacio de puntuación , espacio delgado, espacio de pelo, espacio de ancho cero, no ensamblador de ancho cero, ensamblador de ancho cero], separador de línea, separador de párrafo, espacio estrecho sin interrupciones, espacio matemático medio, ensamblador de palabras, espacio ideográfico y el ancho cero no romper el espacio.

Muchos de estos causan estragos en los archivos xml cuando se exportan desde herramientas automatizadas o sitios que estropean las búsquedas de texto, el reconocimiento y se pueden pegar de manera invisible en el código fuente PHP, lo que hace que el analizador salte al siguiente comando (separadores de párrafo y línea), lo que genera líneas. del código que se debe omitir, lo que da como resultado errores intermitentes e inexplicables a los que comenzamos a denominar "enfermedades de transmisión textual"

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

ppostma1
fuente
1
¿Como eso? Traté de explicar que el anterior ya no funciona como debería
ppostma1
¡Excelente! ¿Puedes incluir el recuento de personajes que tienes en tu colección? - - 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 anterior respuesta aceptada.
Léo Léopold Hertz 준영
¡Gracias por la ayuda @Masi!
ppostma1
1
Gracias, PERO el uso trim()debería ser la respuesta correcta
Husam
1
¿No debería haber la ubandera en la expresión regular?
133

Para quitar cualquier espacio en blanco, puede usar una expresión regular

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

Vea también esta respuesta para algo que pueda manejar espacios en blanco en cadenas UTF-8.

Paul Dixon
fuente
Cualquier otra solución. Esto (preg_replace) me falla.
Kathir
Kathir, ¿con qué entrada falla?
Alex
¿Por qué la gente sigue poniendo el +después del s? No lo necesitas para esto.
Buttle Butkus
2
Es un orden de magnitud más rápido que reemplazarlos uno por uno, por eso :)
Paul Dixon
1
Parece que estás tratando de resolver un problema diferente al OP. Esta es una solución para eliminar todos los espacios en blanco de una cadena.
Paul Dixon
26

A veces, necesitaría eliminar espacios en blanco consecutivos. Puedes hacerlo así:

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

Salida:

My name is
trante
fuente
Gracias. Exactamente lo que estaba buscando
lomse
15
$string = str_replace(" ", "", $string);

Creo que preg_replace estaría buscando algo como [:space:]

Tyler Carter
fuente
8

Puede usar la función de recorte de php para recortar ambos lados (izquierdo y derecho)

 trim($yourinputdata," ");

O

trim($yourinputdata);

También puedes usar

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
Documentos: http://php.net/manual/en/function.trim.php

Kumar
fuente
1
Esta debería ser la respuesta correcta, ya que lo hace de forma nativa, exactamente lo que pide el OP. Es pequeño, limpio y 'expandible' agregando carbón adicional para recortar.
Louis Loudog Trottier
Recortar no elimina los espacios DENTRO de la cuerda, solo a la izquierda y a la derecha. Por cierto, el espacio es predeterminado en el ajuste, no tiene que dar el segundo argumento
6

Si desea eliminar todos los espacios en blanco en todas partes de $ tags, ¿por qué no solo:

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

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

manzanilla
fuente
2
si no asigna el resultado a una variable, esto en realidad no haría nada útil.
Paul Dixon
Paul Dixon, ¿qué es una variable? Estoy programando pero no sé qué es una variable ... ¿Para qué sirve? ¿Puedo encontrar esto en la web? ¿Es importante saber qué significa? ¿Por qué ponen $ antes del nombre?
Quiero saber
2

Cualquier opción posible es utilizar un contenedor de archivos personalizado para simular variables como archivos. Puedes lograrlo usando esto:

1) En primer lugar, registre su contenedor (solo una vez en el archivo, utilícelo como session_start ()):

stream_wrapper_register('var', VarWrapper);

2) Luego defina su clase contenedora (está escrito muy rápido, no es completamente correcto, 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) Luego use cualquier función de archivo con su contenedor en el protocolo var: // (también puede usarlo para incluir, requerir, etc.):

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

Nota: No olvide tener su variable en el alcance global (como global $ __ myVar)

micropro.cz
fuente
Esto es complejo, es posible que los principiantes no deseen echarle un vistazo. Pero por mostrar esfuerzo, lo
votaré a favor de que
1
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 archivos temporales, lo cual es feo) de cómo enviar variables a funciones que solo funcionan con archivos (y php_strip_whitespace no es la única). Por ejemplo, puede sustituir el código antes de require - puede crear su propio "precompilador" para PHP donde puede hacer lo que quiera. Lo uso y se vuelve muy poderoso y útil durante años de programación.
micropro.cz
global $$varname;Qué horrible fue en 2013
B001 ᛦ
1

Puedes hacerlo usando ereg_replace

 $str = 'This Is New Method Ever';
 $newstr = ereg_replace([[:space:]])+', '',  trim($str)):
 echo $newstr
 // Result - ThisIsNewMethodEver
Abdulla Nilam
fuente
ereg está obsoleto desde PHP 5.3
1

también usas la preg_replace_callbackfunción. y esta función es idéntica a su hermana preg_replaceexcepto que puede aceptar una función de devolución de llamada que le da más control sobre cómo manipular su salida.

$str = "this is a   string";

echo preg_replace_callback(
        '/\s+/',
        function ($matches) {
            return "";
        },
        $str
      );
samehanwar
fuente
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 .
Samuel Liew
¿Puede agregar ejemplos en los casos en los que la devolución de llamada es útil preg_replace?
Léo Léopold Hertz 준영
1
$string = trim(preg_replace('/\s+/','',$string));
simsek
fuente
1

Esta es una publicación antigua, pero la respuesta más corta no aparece aquí, así que la estoy agregando ahora.

strtr($str,[' '=>'']);

Otra forma común de "despellejar a este gato" sería usar explotar e implosionar de esta manera

implode('',explode(' ', $str));

Yehuda Schwartz
fuente
0

Es una publicación antigua 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;

Las funciones estándar trim () pueden ser problemáticas cuando se trata de entidades HTML. Es por eso que escribí la función "Super Trim" que se usa para manejar este problema y también puede elegir recortar desde el principio, el final o el lado de la cabina de la cuerda.

Ivijan Stefan Stipić
fuente
0

Una forma sencilla de eliminar espacios de toda la cadena es utilizar la función de explosión e imprimir toda la cadena mediante un bucle for.

 $text = $_POST['string'];
            $a=explode(" ", $text);
            $count=count($a);
            for($i=0;$i<$count; $i++){

                echo $a[$i];
            }
Dhruv Thakkar
fuente
0

El argumento \ s regex no es compatible con cadenas de varios bytes UTF-8.

Este PHP RegEx es uno que escribí para resolver esto usando argumentos basados ​​en PCRE (Expresiones regulares compatibles con Perl) como reemplazo de cadenas UTF-8:

function remove_utf8_whitespace($string) { 
   return preg_replace('/\h+/u','',preg_replace('/\R+/u','',$string)); 
}

- Ejemplo de uso -

Antes de:

$string = " this is a test \n and another test\n\r\t ok! \n";

echo $string;

 this is a test
 and another test
         ok!

echo strlen($string); // result: 43

Después:

$string = remove_utf8_whitespace($string);

echo $string;

thisisatestandanothertestok!

echo strlen($string); // result: 28

Listado de argumentos de PCRE

Fuente: https://www.rexegg.com/regex-quickstart.html

Character   Legend  Example Sample Match
\t  Tab T\t\w{2}    T     ab
\r  Carriage return character   see below   
\n  Line feed character see below   
\r\n    Line separator on Windows   AB\r\nCD    AB
    CD
\N  Perl, PCRE (C, PHP, R…): one character that is not a line break \N+ ABC
\h  Perl, PCRE (C, PHP, R…), Java: one horizontal whitespace character: tab or Unicode space separator      
\H  One character that is not a horizontal whitespace       
\v  .NET, JavaScript, Python, Ruby: vertical tab        
\v  Perl, PCRE (C, PHP, R…), Java: one vertical whitespace character: line feed, carriage return, vertical tab, form feed, paragraph or line separator      
\V  Perl, PCRE (C, PHP, R…), Java: any character that is not a vertical whitespace      
\R  Perl, PCRE (C, PHP, R…), Java: one line break (carriage return + line feed pair, and all the characters matched by \v)      
Jeff Clayton
fuente
0

Hay algunos tipos especiales de espacios en blanco en forma de etiquetas. Necesitas usar

$str=strip_tags($str);

para eliminar etiquetas redundantes, etiquetas de error, para llegar primero a una cadena normal.

Y use

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

Es trabajo para mi.

Phước Huệ
fuente