2010-09-13 28 views
6
$variable = 'put returns between paragraphs'; 

El valor de esta variable cambia cada vez.Reemplazar la última palabra en la cadena

¿Cómo agregar un texto antes de la última palabra?


igual que, si queremos añadir 'and', el resultado debería ser (para este ejemplo):

$variable = 'put returns between and paragraphs'; 

Respuesta

2

Usted puede utilizar preg_replace():

$add = 'and'; 
$variable = 'put returns between paragraphs';  
echo preg_replace("~\W\w+\s*$~", ' ' . $add . '\\0', $variable); 

Prints:

put returns between and paragraphs 

Esto ignorará los espacios en blanco al final, algo que la solución de @jensgram no lo hace. (Por ejemplo: se romperá si la cadena es $variable = 'put returns between paragraphs ' Por supuesto se puede utilizar trim(), pero ¿por qué preocuparse de perder más memoria y llamar a otra función cuando puede hacerlo con expresiones regulares :-)

+2

No puedo atribuir la fuente, pero una vez escuché esta gran cita "Tuve un problema y decidí usar expresiones regulares. Ahora tengo dos problemas" – Zak

+0

cómo agregar un poco de html en lugar de 'y' en su solución? – James

+0

@Zak No es un problema si comprende Regex y sabe lo que puede o no puede hacer. – NullUserException

1
1) reverse your string 
2) find the first whitespace in the string. 
3) chop off the remainder of the string. 
4) reverse that, append your text 
5) reverse and add back on the first portion of the string from step 3, including extra whitespace as needed. 
+0

revirtiendo que muchas veces es completamente unnessecary – GSto

+1

Por supuesto, es innecesario, pero es simple, y esta simple pregunta claramente necesita una respuesta simple y comprensible en inglés simple (no en código) para recorrer el proceso lógico de cómo resolver un problema. – Zak

+0

Si no tiene 'strrpos', este algoritmo parece bastante razonable. – erisco

1
$addition = 'and'; 
$variable = 'put returns between paragraphs'; 
$new_variable = preg_replace('/ ([^ ]+)$/', ' ' . $addition . ' $1', $variable); 
+0

Considera reemplazar el '*' con '+' en el patrón. – jensgram

+0

@jensgram Gracias por tomar eso. –

10

Puede encontrar el .? última espacios en blanco usando la función strrpos():

$variable = 'put returns between paragraphs'; 
$lastSpace = strrpos($variable, ' '); // 19 

Luego, tome los dos substrings (antes y después del último espacio en blanco) y envolver alrededor de la 'y':

$before = substr(0, $lastSpace); // 'put returns between' 
$after = substr($lastSpace); // ' paragraphs' (note the leading whitespace) 
$result = $before . ' and' . $after; 

EDITAR
Aunque nadie quiere meterse con índices de subcadenas esta es una muy tarea básica de qué buques PHP con funciones útiles (especificamente strrpos() y substr()). Por lo tanto, no hay necesidad de hacer malabares matrices, invierte cadenas o expresiones regulares - pero puede, por supuesto :)

+0

gran respuesta jensgram. – Zak

+1

@NullUserException Tiene razón sobre un posible espacio en blanco al final ('trim()' podría ser la solución).En términos de qué solución es "más limpia", es altamente subjetiva. Lo anterior es fácil de comentar (y, por lo tanto, fácil de entender), mientras que yo también considero que las soluciones de expresiones regulares son limpias. – jensgram

+1

Encuentro mi solución regex más limpia que esta. Además puedes modificarlo para usar separadores diferentes, o ignorar los espacios en blanco al final (como el mío). Esto se romperá si tu cadena es '' put devuelve entre párrafos '' (con un espacio en blanco al final) – NullUserException

1

otra opción

<?php 
    $v = 'put returns between paragraphs'; 
    $a = explode(" ", $v); 
    $item = "and"; 
    array_splice($a, -1, 0, $item); 
    echo implode(" ",$a); 
    ?> 
Cuestiones relacionadas