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

La valeur de cette variable change à chaque fois.Remplacer le dernier mot de la chaîne

Comment ajouter du texte avant le dernier mot?


Comme, si nous voulons ajouter 'and', le résultat devrait être (pour cet exemple):

$variable = 'put returns between and paragraphs'; 

Répondre

2

Vous pouvez utiliser preg_replace():

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

Impressions:

put returns between and paragraphs 

Ceci ignorera les espaces de fin, ce que ne fait pas la solution de @ jensgram. (Par exemple: il casse si votre chaîne est $variable = 'put returns between paragraphs ' Bien sûr, vous pouvez utiliser trim(), mais pourquoi la peine de perdre plus de mémoire et appeler une autre fonction lorsque vous pouvez le faire avec regex :-)

+2

Je ne peux pas attribuer la source, mais une fois j'ai entendu cette citation "J'ai eu un problème et j'ai décidé d'utiliser des expressions rationnelles Maintenant j'ai deux problèmes" – Zak

+0

comment ajouter du html au lieu de 'et' dans votre solution? – James

+0

@Zak Ce n'est pas un problème si vous connaissez regex, et savez ce qu'il peut et ne peut pas faire. – 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

inversent que plusieurs fois est complètement unnessecary – GSto

+1

bien sûr, il est inutile, mais c'est simple, et cette simple question a clairement besoin d'une réponse simple et compréhensible en anglais (pas en code) pour suivre le processus logique de résolution d'un problème. – Zak

+0

Si vous n'aviez pas 'strrpos', cet algorithme semble assez raisonnable. – erisco

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

Envisagez de remplacer le '*' par '+' dans le motif. – jensgram

+0

@jensgram Merci d'avoir attrapé ça. –

10

Vous pouvez trouver le .? dernière des espaces en utilisant la fonction strrpos():

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

Ensuite, prenez les deux substrings (avant et après le dernier espace) et enrouler autour du 'et':

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

EDIT
Bien que personne ne veut jouer avec les indices de sous-chaîne ceci est une tâche de base très pour lesquels PHP est livré avec des fonctions utiles (specificly strrpos() et substr()). Par conséquent, il n'y a pas besoin de jongler avec des tableaux, inversées des chaînes ou des expressions rationnelles - mais vous pouvez, bien sûr :)

+0

bonne réponse jensgram. – Zak

+1

@NullUserException Vous avez raison à propos d'un espace de fin possible ('trim()' pourrait être la solution).En termes de quelle solution est «propre», c'est très subjectif. Ce qui précède est facile à commenter (et donc, facile à comprendre) alors que moi-même je trouve les solutions regex aussi. – jensgram

+1

Je trouve ma solution regex plus propre que ça. En outre, vous pouvez le modifier pour utiliser des séparateurs différents, ou ignorer les espaces blancs de fin (comme le mien). Cela va se casser si votre chaîne est '' mettre des retours entre les paragraphes ''(avec un espace de fin) – NullUserException

1

une autre option

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