¿Cómo eliminar parte de una cadena? [cerrado]


152

¿Cómo puedo eliminar parte de una cadena?

Cadena de ejemplo: "REGISTER 11223344 here"

¿Cómo puedo eliminar "11223344"de la cadena de ejemplo anterior?


Su pregunta es poco clara / ambigua. Está utilizando el término remove, pero parece probable que quiera decir extractque la cadena de destino se puede almacenar en la base de datos.
mickmackusa

@Makyen Estoy bastante seguro de que ha destrozado la pregunta para hacer que muchas de las respuestas sean correctas. Piénselo: ¿por qué querría el OP guardar REGISTER hereen la base de datos?
mickmackusa

2
@mickmackusa remove puede ser sinónimo de quitar, es decir, sacar 11223344 de la cadena, no veo el problema aquí. En el peor de los casos, es ambiguo, ciertamente no está "destrozado"
Nick

Lea las versiones pre-vandalizadas. @Nick stackoverflow.com/posts/2192170/revisions La verdad te hará cambiar de opinión. Me encantaría ver esta pregunta cerrada como poco clara.
mickmackusa

2
@mickmackusa lo hice ... No entiendo tu punto. Si tiene un problema tan grande con la forma en que está escrito, ¿por qué no lo arregla usted mismo
Nick

Respuestas:


220

Si está apuntando específicamente a "11223344", use str_replace:

// str_replace($search, $replace, $subject)
echo str_replace("11223344", "","REGISTER 11223344 here");

44
str_replace ($ search, $ replace, $ subject)
drooh

119

Puede usar str_replace () , que se define como:

str_replace($search, $replace, $subject)

Entonces podrías escribir el código como:

$subject = 'REGISTER 11223344 here' ;
$search = '11223344' ;
$trimmed = str_replace($search, '', $subject) ;
echo $trimmed ;

Si necesita una mejor coincidencia a través de expresiones regulares, puede usar preg_replace () .


2
Si se necesita una coincidencia de expresiones regulares
Elijah Lynn

44
No estoy seguro de por qué se publicó esta respuesta, es un duplicado más largo de la respuesta de Dominic y un duplicado más corto de la respuesta de Roland ...
CPHPython

23

suponiendo que 11223344 no es constante

$string="REGISTER 11223344 here";
$s = explode(" ",$string);
unset($s[1]);
$s = implode(" ",$s);
print "$s\n";

10
str_replace(find, replace, string, count)
  • encontrar requerido. Especifica el valor a buscar
  • reemplazar requerido. Especifica el valor para reemplazar el valor en find
  • Cadena requerida. Especifica la cadena a buscar
  • cuenta opcional. Una variable que cuenta el número de reemplazos.

Según el ejemplo de OP:

$Example_string = "REGISTER 11223344 here";
$Example_string_PART_REMOVED = str_replace('11223344', '', $Example_string);

// will leave you with "REGISTER  here"

// finally - clean up potential double spaces, beginning spaces or end spaces that may have resulted from removing the unwanted string
$Example_string_COMPLETED = trim(str_replace('  ', ' ', $Example_string_PART_REMOVED));
// trim() will remove any potential leading and trailing spaces - the additional 'str_replace()' will remove any potential double spaces

// will leave you with "REGISTER here"

1
¿Cómo propones que el OP use este pseudocódigo?
mickmackusa

6

Cuando necesite una coincidencia basada en reglas, debe usar expresiones regulares

$string = "REGISTER 11223344 here";
preg_match("/(\d+)/", $string, $match);
$number = $match[1];

Eso coincidirá con el primer conjunto de números, así que si necesita ser más específico, intente:

$string = "REGISTER 11223344 here";
preg_match("/REGISTER (\d+) here/", $string, $match);
$number = $match[1];

preg_replace () sería mucho más fácil, ¿no? us2.php.net/manual/en/function.preg-replace.php
Elijah Lynn

1
Reemplazar @ElijahLynn requiere que elimines cosas, cambios futuros o el ruido se rompería. Hacer esto a través de _replace pero _match continuaría funcionando.
TravisO

@TravisO bueno sí, pero no. Esos dos son casi las mismas funciones de implementación inteligente, y las posibilidades de que los cambios futuros afecten a cualquiera de ellas son las mismas . Existe la misma posibilidad de cambios futuros solo en _match, lo que hace que este uso sea inválido y _replace todavía funciona bien. Además, el control de versiones generalmente es muy atento a no frenar la funcionalidad anterior, si es posible.
CT.

No necesitas un grupo de captura aquí. De hecho, el uso del grupo de captura hincha innecesariamente la $matchmatriz. Quite los paréntesis y luego acceda a través de $match[0].
mickmackusa

5

substr () es una función php incorporada que devuelve parte de una cadena. La función substr () tomará una cadena como entrada, la forma de índice donde desea que se recorte la cadena. y un parámetro opcional es la longitud de la subcadena. Puede ver la documentación adecuada y el código de ejemplo en http://php.net/manual/en/function.substr.php

NOTA: el índice de una cadena comienza con 0.


¿Cómo propones que el OP debe usar tu pista general para lograr el resultado deseado?
mickmackusa

Considero que esta respuesta es vaga y de poco valor.
mickmackusa

1

Dinámicamente, si desea eliminar (a) parte (s) de (a) índice (s) fijo (s) de una cadena, use esta función:

/**
 * Removes index/indexes from a string, using a delimiter.
 * 
 * @param string $string
 * @param int|int[] $index An index, or a list of indexes to be removed from string.
 * @param string $delimiter 
 * @return string
 * @todo Note: For PHP versions lower than 7.0, remove scalar type hints (i.e. the
 * types before each argument) and the return type.
 */
function removeFromString(string $string, $index, string $delimiter = " "): string
{
    $stringParts = explode($delimiter, $string);

    // Remove indexes from string parts
    if (is_array($index)) {
        foreach ($index as $i) {
            unset($stringParts[(int)($i)]);
        }
    } else {
        unset($stringParts[(int)($index)]);
    }

    // Join all parts together and return it
    return implode($delimiter, $stringParts);
}

Para su propósito:

remove_from_str("REGISTER 11223344 here", 1); // Output: REGISTER here

Uno de sus usos es ejecutar cadenas similares a comandos, que conoce sus estructuras.


1
Ghostdog ya sugirió una técnica de explosión-implosión, pero no puedo imaginar entretener una técnica tan larga para una operación tan básica.
mickmackusa

0

El siguiente fragmento imprimirá "REGÍSTRATE aquí"

$string = "REGISTER 11223344 here";

$result = preg_replace(
   array('/(\d+)/'),
   array(''),
   $string
);

print_r($result);

La API preg_replace () nos usa como se indica a continuación.

$result = preg_replace(
    array('/pattern1/', '/pattern2/'),
    array('replace1', 'replace2'),
    $input_string
);

No hay absolutamente ninguna razón para pasar matrices preg_replace()en este caso. Tampoco hay ningún beneficio al usar un grupo de captura.
mickmackusa

Estoy de acuerdo. La matriz se agrega solo por conveniencia. Se puede descuidar. No hará daño. Grupo de captura agregado para excluir números. Esto funciona según la pregunta trazada. Y se pueden realizar más modificaciones y ajustes en función de los individuos.
arango_86

Mi punto es que hay inclusiones innecesarias en tu fragmento que no tiene sentido incluir.
mickmackusa

-1

Haz lo siguiente

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER(.*)here/','',$string);

Esto devolvería "REGÍSTRATE aquí"

o

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER (.*) here/','',$string);

Esto devolvería "REGÍSTRATE aquí"


44
¿No devolvería "REGISTER__here", con dos espacios en blanco (piense en subrayado como espacios, el comentario no me permitirá dos espacios posteriores)? Debido a los espacios antes y después del "(. *)".
TechNyquist

66
Esta respuesta es AL MENOS 100% incorrecta. Prueba: 3v4l.org/LDLEM ¿ por qué esta respuesta tiene 15 UV?
mickmackusa
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.