Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Duda con substr_replace

Estas en el tema de Duda con substr_replace en el foro de PHP en Foros del Web. Saludos amigos. Tengo un problema con substr_replace y os lo pregunto por si podéis echarme una mano. Tengo un string en el que debo colocar ...
  #1 (permalink)  
Antiguo 23/10/2015, 13:25
Avatar de Jilti  
Fecha de Ingreso: abril-2007
Mensajes: 47
Antigüedad: 17 años
Puntos: 4
Duda con substr_replace

Saludos amigos.

Tengo un problema con substr_replace y os lo pregunto por si podéis echarme una mano.

Tengo un string en el que debo colocar cada ciertos caracteres otro carácter. Me explico, en el string "abcdefghijklmn" tengo que colocar a partir del segundo carácter el símbolo "@".... eso lo tengo hecho.

Código PHP:
Ver original
  1. <?php
  2. $string = substr_replace("abcdefghijklmn", "@", 2, 0)."</br>";
  3. echo $string;
  4. ?>

El problema me viene cuando tengo que colocar varios "@", por ejemplo en la posición 2, 6 y 8. No se si me he explicado bien.

¿Cómo se haría? y si se puede hacer de otra manera.... ¿cual?

Muchas gracias de antemano por la ayuda.
  #2 (permalink)  
Antiguo 23/10/2015, 13:48
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Duda con substr_replace

Cita:
¿Cómo se haría? y si se puede hacer de otra manera.... ¿cual?
No sabría decirte, creo que tengo que leer el manual de substr_replace() para ver si es posible, ¿me esperas?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 23/10/2015, 16:36
 
Fecha de Ingreso: mayo-2013
Mensajes: 169
Antigüedad: 11 años
Puntos: 25
Respuesta: Duda con substr_replace

Cita:
Iniciado por pateketrueke Ver Mensaje
No sabría decirte, creo que tengo que leer el manual de substr_replace() para ver si es posible, ¿me esperas?
Menudo sarcasmo... No entiendo porque eres así con todo el mundo... Además que esto que haces es trolling puro y duro.

El user ha dado un codigo, bien formateado, ha explicado correctamente su duda. Está usando una función que de muy seguro lo habrá sacado de agún tutorial, o es una de las pocas funciones de cadenas que conoce. Y seguramente ya haya echado un vistazo al manual.

Pero claro, tú, como tu das por sentado que todos tienen la misma comprensión lectora que tú, y como para tí es muy fácil, ya das por hecho que nuestros newbies no han hecho sus deberes.

Pero lamento decirte que no todos aun leyendo el manual, sabrían a primeras usar correctamente las funciones PHP. Tambien son tantas las funciones, que no es dificil perderse o querer usar la que no es para algo diferente a su proposito, teniendo otra que no ha visto que hace mejor lo que quiere hacer.
  #4 (permalink)  
Antiguo 23/10/2015, 16:47
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Duda con substr_replace

Cita:
El problema me viene cuando tengo que colocar varios "@", por ejemplo en la posición 2, 6 y 8. No se si me he explicado bien.
Pues yo creo que primero deberías "cortar" la cadena son substr() para que obtengas un array de todos esos fragmentos, al final usas join() para unir todo con el separador que quieras.

Es decir, si el incrementador es constante entonces es simple con un bucle:

Código PHP:
Ver original
  1. $inc = 2;
  2. $text = 'abcdefghijklmnop';
  3. $length = strlen($text);
  4. $fragments = [];
  5.  
  6. for ($i = 0; $i < $length; $i += $inc) {
  7.   $fragments []= substr($text, $i, $inc);
  8. }
  9.  
  10. echo join('@', $fragments);

El problema de hacerlo con substr_replace() es que tras cada cambio la cadena muta, entonces el índice ya no sería 2 sino 3, y así progresivamente por lo tanto no es conveniente asumir que el índice siempre será el mismo.

Amiancht, bueno, ¿y entonces tenemos que hacer las cosas por alguien más siempre?

¿Tu qué entendiste al leer esto?

Cita:
¿Cómo se haría? y si se puede hacer de otra manera.... ¿cual?
Básicamente quiere que le digamos cómo hacer las cosas: exactamente.

Eso no es pedir ayuda, es buscar que alguien haga su trabajo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 23/10/2015, 16:54
 
Fecha de Ingreso: mayo-2013
Mensajes: 169
Antigüedad: 11 años
Puntos: 25
Respuesta: Duda con substr_replace

Cita:
Iniciado por Jilti Ver Mensaje
Saludos amigos.

Tengo un problema con substr_replace y os lo pregunto por si podéis echarme una mano.

Tengo un string en el que debo colocar cada ciertos caracteres otro carácter. Me explico, en el string "abcdefghijklmn" tengo que colocar a partir del segundo carácter el símbolo "@".... eso lo tengo hecho.

Código PHP:
Ver original
  1. <?php
  2. $string = substr_replace("abcdefghijklmn", "@", 2, 0)."</br>";
  3. echo $string;
  4. ?>

El problema me viene cuando tengo que colocar varios "@", por ejemplo en la posición 2, 6 y 8. No se si me he explicado bien.

¿Cómo se haría? y si se puede hacer de otra manera.... ¿cual?

Muchas gracias de antemano por la ayuda.
La función substr_replace lo que hace es remplazar el una parte del string por el string que le pasas. Sin embargo si le pones a ultimo parametro 0, no sustituye nada, y simplemente lo inserta.

Eso básicamente ya veo que lo comprendes. La función si vas al manual de php te va a decir lo mismo, y no te va a resolver tu problema, ya que no tiene ningún otra forma de usarla como tú quieres. Aquí a tu pregunta, lo debes resolver a partir de tu propia lógica.

Lo que deberas hacer es llamar varias veces a la misma función, pasandole como parametro $string, y teniendo en cuenta además los caracteres que vas insertando.
Código PHP:
Ver original
  1. <?php
  2. $a = 1;
  3. $string = substr_replace("1234567890", "?", 2, 0);
  4. $string = substr_replace($string, "?", 6 + $a++, 0);
  5. $string = substr_replace($string, "?", 8 + $a++, 0);
  6. echo $string;
La primera llamada lo queremos poner despues de 2, y no hacemos nada extraordinario. Pero en la segunda linea, le pasamos el string actualizado de la anterior y lo queremos poner en 6, pero como anteriormente hemos insertado entonces la posición 6 no es la misma que la de antes, por lo que debemos sumarle 1. Y en la tercera llamada le sumamos 2 ($a++) a 8, porque ya tendríamos 2 caracteres insertados anteriormente.

Un saludo.
  #6 (permalink)  
Antiguo 23/10/2015, 17:07
 
Fecha de Ingreso: mayo-2013
Mensajes: 169
Antigüedad: 11 años
Puntos: 25
Respuesta: Duda con substr_replace

Cita:
Iniciado por pateketrueke Ver Mensaje
Básicamente quiere que le digamos cómo hacer las cosas: exactamente.

Eso no es pedir ayuda, es buscar que alguien haga su trabajo.
Mmm, no lo tengo muy claro, recuerdo cuando una vez pedi ayuda en este foro, y me salistes con que fuera a ver el manual jaja Y es que mi duda era sobre lo que expresaba el manual xD que no tenía ni ejemplos, ni comentarios ni nada.

Pero sí, yo por eso, suelo evitar darle a la gente el trabajo hecho. A veces viene cualquier listillo, pero si vamos de malas contra ellos a veces pagan justos por pecadores.

Por ejemplo, en mi anterior post he puesto un ejemplo, con las variables cambiadas, para explicar que las puede encadenar las llamadas a la misma función.

Aunque me gusta tu codigo.
  #7 (permalink)  
Antiguo 24/10/2015, 12:27
Avatar de Jilti  
Fecha de Ingreso: abril-2007
Mensajes: 47
Antigüedad: 17 años
Puntos: 4
Respuesta: Duda con substr_replace

Saludos.

Antes de nada comentar que en ningún momento he querido que me den el trabajo hecho, me leí todas las funciones de strings y pensé que substr_replace era la que mas se ajustaba a mis necesidades.

En realidad lo que necesito modificar no es sólo un string, si no un archivo de texto con cientos de líneas y cientos de caracteres en un string en cada línea.

En bash en una sola línea se puede hacer

Código C++:
Ver original
  1. awk -vFS="" -vOFS="" '{$6=$6","}{$7=$7"@"}{$15=$15","}1'  1.txt > 2.txt;

La posición de las "modificaciones" no es constante.

Mi intención es que con la función substr_replace y fopen modificar ese archivo de texto a mis necesidades, pero como en la función awk de bash se puede meter en la misma línea de código todas las posiciones de las "modificaciones" pensé que tal vez con substr_replace habría alguna manera de hacerlo. Googlee durante toda la tarde para ver si es posible pero al no encontrar nada pregunté aquí por si algún gurú sabía como hacerlo, pero parece claro que sólo admite una posición, no puedes meter varias.

Gracias pateketrueke por tu código, pero no creo que me sirva al no ser la posición de las inserciones constantes.

Muchas gracias Amiancht también por tu código, antes de entrar a preguntar había llegado a la misma conclusión, solo que sin $a++ (que es interesante). Si sigo atorado me imagino que será la que tengo que utilizar.

Saludos y gracias a todos
  #8 (permalink)  
Antiguo 24/10/2015, 13:06
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Duda con substr_replace

Saludo
Uhm, pues así el asunto cambia.

Lo que se me ocurriría a mí es leer el archivo línea a línea,
y en cada línea, hacer un ciclo con los caracteres que se
buscan y los que se quieren reemplazar, y hacer uso de str_replace
para evitar el tema de los substrings ya comentado.

Ej
Código PHP:
Ver original
  1. //busquedas y reemplazos tendrían que tener el mismo número de elementos
  2. $busquedas = array('?', '1','a','*');
  3. $reemplazos = array('!','2','b','@');
  4. for(....) //ciclo de lectura del archivo
  5. {
  6. for($i = 0; $i < sizeof($busquedas); $i++)
  7. {
  8. $texto = $lineadelarchivo;
  9.   $texto = str_replace($busquedas[$i], $reemplazos[$i], $texto);
  10. //a menos que el reemplazo sea constante, solo necesitariamos $busquedas
  11.   $texto = str_replace($busquedas[$i], '@', $texto);
  12. }
  13. }

Y así el asunto, en el ciclo de lectura, se puede hacer también la escritura
a un archivo nuevo, que entiendo es lo que hace la línea de awk.

Espero sirva la idea.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #9 (permalink)  
Antiguo 24/10/2015, 13:53
Avatar de Jilti  
Fecha de Ingreso: abril-2007
Mensajes: 47
Antigüedad: 17 años
Puntos: 4
Respuesta: Duda con substr_replace

Gracias multiprogramador por la ayuda, no busco reemplazar un carácter por otro, si no meter un carácter en concreto cada cierto número (no constante) de caracteres. He encontrado la solución, que se parece a la solución que tu me das.

Ejemplo: meter el signo @ en la posición 1, 3, 6 y 10 de un string

Código PHP:
Ver original
  1. $array = array(1, 3, 6, 10);
  2. $longitud = count($array);
  3. $string ="abcdefghijklmn";
  4. for($i=0; $i<$longitud; $i++)
  5.       {
  6. $string = substr_replace($string, "@", $array[$i], 0);
  7.       }
  8. echo $string;

Ahora sólo falta aplicarlo a la lectura, modificación del archivo de texto.

Gracias de nuevo mortiprogramador por la ayuda prestada.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:23.